这是一个我定义了协议的类。我在其中定义的协议类是一个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")
}
...
}
}乙级:
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类中创建了协议蓝图
b.在A类中设置一个可选委托变量
c.通过A类中的委托传递值
d.向B类添加了协议,并实现了使其符合协议的功能。
e.将A类的委托设置为self(即B类)
我对斯威夫特还是很陌生的,所以我可能错过了什么。有人能发光吗?我还没做什么?
发布于 2016-06-15 10:36:27
因为您的BlueCoreManager是单例的,所以您不应该像在视图控制器中那样创建它的实例。
您应该始终使用BlueCoreManager.shared()来获取单例实例。
发布于 2016-06-15 10:18:02
造成这种情况的原因有多种:
viewDidLoad之前执行对发现外围设备的调用,并在此之前发现外围设备,因此没有设置del变量。也许它在BlueCoreManager init代码中,在availableDevicesViewController被初始化时执行,在viewDidLoad执行之前很久。didDiscoverPeripheral根本不被调用--如果有些扫描无法检测到任何设备。我强烈建议您将委托var设置为弱变量,而不仅仅是可选的:
weak var del: deviceNameDelegate?
以及使用选项词的方式,他们的意图:
del?.discoveredDeviceName(peripheralName, peripheral: peripheralDevice)
https://stackoverflow.com/questions/37831768
复制相似问题