这是我定义协议的类。 I类定义的协议是NSObject(如果这有任何区别)。
A类:
import UIKit
import CoreBluetooth
protocol deviceNameDelegate {
func discoveredDeviceName(deviceName: String, peripheral: CBPeripheral)
}
class BlueCoreManager: NSObject, CBCentralManagerDelegate, CBPeripheralDelegate {
...
var del: deviceNameDelegate?
...
func centralManager(central: CBCentralManager, didDiscoverPeripheral peripheral: CBPeripheral, advertisementData: [String : AnyObject], RSSI: NSNumber) {
if del != nil {
let peripheralName = peripheral.name!
let peripheralDevice = peripheral
print("Delegate is not nil")
del!.discoveredDeviceName(peripheralName, peripheral: peripheralDevice)
} else {
print("delegate is nil")
}
...
}
}
B级:
import UIKit
import CoreBluetooth
class availableDevicesViewController: UIViewController, deviceNameDelegate {
var ble = BlueCoreManager()
...
override func viewDidLoad() {
super.viewDidLoad()
ble.del = self
}
func discoveredDeviceName(deviceName: String, peripheral: CBPeripheral) {
...
}
}
我之前已经实施过两次自定义协议,但我真的很难过这个。我似乎无法弄清楚它为什么不起作用。我遵循的步骤:
一个。我在A类中创建了协议蓝图
湾在A类中制作了一个可选的委托变量
℃。通过A类中的委托传递值
d。为B类添加了协议并实现了使其符合协议的功能
即将A类的代表设置为self(即B类)
我仍然很快乐,所以也许我可能错过了一些东西。任何人都能发光吗?我不做什么?
答案 0 :(得分:1)
由于您的BlueCoreManager
是单身,因此您不应该像在视图控制器中那样创建它的实例。
您应始终使用BlueCoreManager.shared()
来获取单例实例。
答案 1 :(得分:0)
这可能有多种原因:
- 在viewDidLoad
之前执行调用以发现外围设备并发现外围设备,因此未设置del
变量。也许它出现在BlueCoreManager
init
代码中,该代码在availableDevicesViewController
被初始化时执行,早在执行viewDidLoad
之前执行。
- 根本没有调用didDiscoverPeripheral
- 如果有些扫描无法检测到任何设备。
我强烈建议你让委托变量为弱变量,而不仅仅是可选:
weak var del: deviceNameDelegate?
以及他们按照预期的方式使用期权:
del?.discoveredDeviceName(peripheralName, peripheral: peripheralDevice)