首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >即使在设置委托之后,协议也无法工作。

即使在设置委托之后,协议也无法工作。
EN

Stack Overflow用户
提问于 2016-06-15 09:43:45
回答 2查看 221关注 0票数 0

这是一个我定义了协议的类。我在其中定义的协议类是一个NSObject(如果这有任何区别的话)。

A类:

代码语言:javascript
复制
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")
        }
...
      }
   }

乙级:

代码语言:javascript
复制
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类)

我对斯威夫特还是很陌生的,所以我可能错过了什么。有人能发光吗?我还没做什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-06-15 10:36:27

因为您的BlueCoreManager是单例的,所以您不应该像在视图控制器中那样创建它的实例。

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

票数 1
EN

Stack Overflow用户

发布于 2016-06-15 10:18:02

造成这种情况的原因有多种:

  • viewDidLoad之前执行对发现外围设备的调用,并在此之前发现外围设备,因此没有设置del变量。也许它在BlueCoreManager init代码中,在availableDevicesViewController被初始化时执行,在viewDidLoad执行之前很久。
  • didDiscoverPeripheral根本不被调用--如果有些扫描无法检测到任何设备。

我强烈建议您将委托var设置为弱变量,而不仅仅是可选的:

weak var del: deviceNameDelegate?

以及使用选项词的方式,他们的意图:

del?.discoveredDeviceName(peripheralName, peripheral: peripheralDevice)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37831768

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档