【问题标题】:Protocol not working even after setting the delegate即使在设置委托后协议也不起作用
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

  • @Paulw11 你能看看这个问题。它也关于协议和错误是相似的,唯一的区别是它在 uipageviewcontroller 和工具栏内的协议。代表显示为零。这个问题没有单身人士。 stackoverflow.com/questions/38330509/…
【解决方案2】:

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

我强烈建议您将委托 var 设为弱 var,而不仅仅是可选的:
weak var del: deviceNameDelegate?
以及按预期方式使用选项:
del?.discoveredDeviceName(peripheralName, peripheral: peripheralDevice)

【讨论】:

  • 我在 del!.discoveredDeviceName(...) 之前进行检查,所以没关系
猜你喜欢
  • 2017-09-18
  • 1970-01-01
  • 1970-01-01
  • 2019-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多