即使在设置委托后协议也不起作用
Protocol not working even after setting the delegate
这是我定义协议的 class。 class 我在其中定义的协议是一个 NSObject(如果有任何区别的话)。
class答:
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")
}
...
}
}
class乙:
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) {
...
}
}
我之前已经实现了两次自定义协议,但我真的对这个感到难过。我似乎无法弄清楚为什么它不起作用。我遵循的步骤:
一个。我在 class A
中创建了协议蓝图
b。在 class A
中创建了一个可选的委托变量
c。通过 class A
中的委托传递值
d.添加协议到class B 并实现功能使其符合协议
e。将来自 class A 的委托设置为自己(即 class B)
我对 swift 还是很陌生,所以我可能错过了一些东西。任何人都可以发光吗?我没有做什么?
这有多种可能的原因:
- 执行发现外围设备的调用,并且在 viewDidLoad
之前发现外围设备,因此未设置 del
变量。也许它在您的 BlueCoreManager
init
代码中,它在 availableDevicesViewController
初始化时执行,远早于 viewDidLoad
执行。
- didDiscoverPeripheral
根本不被调用 - 如果扫描无法检测到任何设备。
我强烈建议您将委托变量设为弱变量,而不仅仅是可选的:
weak var del: deviceNameDelegate?
以及按预期方式使用可选值:
del?.discoveredDeviceName(peripheralName, peripheral: peripheralDevice)
由于您的 BlueCoreManager
是单例,因此您不应该像在视图控制器中那样创建它的实例。
您应该始终使用 BlueCoreManager.shared()
来获取单例实例。
这是我定义协议的 class。 class 我在其中定义的协议是一个 NSObject(如果有任何区别的话)。
class答:
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")
}
...
}
}
class乙:
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) {
...
}
}
我之前已经实现了两次自定义协议,但我真的对这个感到难过。我似乎无法弄清楚为什么它不起作用。我遵循的步骤:
一个。我在 class A
中创建了协议蓝图b。在 class A
中创建了一个可选的委托变量c。通过 class A
中的委托传递值d.添加协议到class B 并实现功能使其符合协议
e。将来自 class A 的委托设置为自己(即 class B)
我对 swift 还是很陌生,所以我可能错过了一些东西。任何人都可以发光吗?我没有做什么?
这有多种可能的原因:
- 执行发现外围设备的调用,并且在 viewDidLoad
之前发现外围设备,因此未设置 del
变量。也许它在您的 BlueCoreManager
init
代码中,它在 availableDevicesViewController
初始化时执行,远早于 viewDidLoad
执行。
- didDiscoverPeripheral
根本不被调用 - 如果扫描无法检测到任何设备。
我强烈建议您将委托变量设为弱变量,而不仅仅是可选的:
weak var del: deviceNameDelegate?
以及按预期方式使用可选值:
del?.discoveredDeviceName(peripheralName, peripheral: peripheralDevice)
由于您的 BlueCoreManager
是单例,因此您不应该像在视图控制器中那样创建它的实例。
您应该始终使用 BlueCoreManager.shared()
来获取单例实例。