【发布时间】:2016-06-15 09:43:45
【问题描述】:
这是我定义协议的类。我在其中定义协议的类是一个 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 类中创建了协议蓝图
b.在 A 类中创建了一个可选的委托变量
c。通过 A 类中的委托传递值
d。给B类添加协议并实现符合协议的功能
e。将 A 类的委托设置为 self(即 B 类)
我对 swift 还是很陌生,所以也许我错过了一些东西。任何人都可以发光吗?我不做什么?
【问题讨论】:
-
协议用于子类与父类的通信。
-
所以你是说我不能在这里使用协议进行通信?
-
@Gagan_iOS 你是什么意思?这是对代表的完全有效的使用。委托人和委托人之间不需要有任何特定的关系
-
@jobs。我建议您设置断点以查看发生了什么。您是否有多个
BlueCoreManager实例?是否有可能调用didDiscoverPeripheral的对象实例不是设置del的实例? -
如果该类是一个单例,那么您不应该启动一个新副本。您应该始终使用
BlueCoreManager.shared()来获取单例实例。
标签: ios swift delegates singleton swift-protocols