首页 > 解决方案 > 在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];

            }
}

标签: iosobjective-cswiftprotocols

解决方案


您很可能会创建多个KestrelDeviceConnect对象。一个有一个 的代表ViewController,并且很可能还有另一个您实际上正在用于任何事情。

我怀疑你的意思是这条线,它创建了一个新的 KestrelDeviceConnect:

_kestrelVC = [[KestrelDeviceConnect alloc]init];

变成这样:

_kestrelVC = [KestrelDeviceConnect singleton];

推荐阅读