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

时间:2016-06-15 09:43:45

标签: ios swift delegates singleton swift-protocols

这是我定义协议的类。 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类)

我仍然很快乐,所以也许我可能错过了一些东西。任何人都能发光吗?我不做什么?

2 个答案:

答案 0 :(得分:1)

由于您的BlueCoreManager是单身,因此您不应该像在视图控制器中那样创建它的实例。

您应始终使用BlueCoreManager.shared()来获取单例实例。

答案 1 :(得分:0)

这可能有多种原因:
- 在viewDidLoad之前执行调用以发现外围设备并发现外围设备,因此未设置del变量。也许它出现在BlueCoreManager init代码中,该代码在availableDevicesViewController被初始化时执行,早在执行viewDidLoad之前执行。 - 根本没有调用didDiscoverPeripheral - 如果有些扫描无法检测到任何设备。

我强烈建议你让委托变量为弱变量,而不仅仅是可选:
weak var del: deviceNameDelegate?
以及他们按照预期的方式使用期权:
del?.discoveredDeviceName(peripheralName, peripheral: peripheralDevice)