即使在设置委托后协议也不起作用

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() 来获取单例实例。