ios - 在objective-c中调用的Swift协议不起作用
问题描述
我试图让这个快速协议在目标 c 文件中工作,但由于某种原因没有调用该函数。我希望在didConnect()
设备连接时didDisconnect()
调用它,并在设备断开连接时调用它。我在 centralManager 中设置了一个断点并执行了连接功能并打印出来delegate
,它又回来了nil
@objc protocol KestrelDeviceConnectDelegate {
@objc func didConnect()
@objc func didDisconnect()
}
@objcMembers
class KestrelDeviceConnect: NSObject{
static let singleton = KestrelDeviceConnect()
public var delegate: KestrelDeviceConnectDelegate?
func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) {
self.isInitialReading = false
self.kestrelIsConnected = true
kestrelPeripheral.discoverServices(nil)
self.delegate?.didConnect()
}
func centralManager(_ central: CBCentralManager, didDisconnectPeripheral peripheral: CBPeripheral, error: Error?) {
self.kestrelIsConnected = false
self.delegate?.didDisconnect()
}
}
在目标c文件中
@interface ViewController ()<KestrelDeviceConnectDelegate> {
KestrelDeviceConnect<KestrelDeviceConnectDelegate> *_kestrelVC;
}
@implementation ViewController
-(void)viewDidLoad {
[super viewDidLoad];
_kestrelVC = [[KestrelDeviceConnect alloc]init];
[_kestrelVC setDelegate:self];
}
-(void)didConnect{
[[self connectToKestrelButton] setHidden:NO];
}
}
解决方案
您很可能会创建多个KestrelDeviceConnect
对象。一个有一个 的代表ViewController
,并且很可能还有另一个您实际上正在用于任何事情。
我怀疑你的意思是这条线,它创建了一个新的 KestrelDeviceConnect:
_kestrelVC = [[KestrelDeviceConnect alloc]init];
变成这样:
_kestrelVC = [KestrelDeviceConnect singleton];
推荐阅读
- flutter - 在 Flutter 应用程序图标未显示在 android 设备中
- c# - 如何模拟 Azure.Storage.Blobs.BlobContainerClient?
- github - How to fix 401 Unauthorized Private Github Package
- c++ - 有没有更好的方法将此函数提供给构造函数?
- python - 我在 Django 中创建了 models.UniqueConstraint 但在数据库中没有找到索引并且没有错误
- python - 多处理未在 Python 中并行执行
- c# - 持有者令牌过期时使用 asp.net 框架 Web API 重定向到 Microsoft 登录的多种身份验证方法
- adobe - 无法弄清楚如何使用 Acrobat Pro 2020 在 PDF 上设置文本字段的文本
- python - CSV - 使用自定义 python 脚本读取问题
- html - 为什么 chrome 不起作用