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

Posted

技术标签:

【中文标题】即使在设置委托后协议也不起作用【英文标题】: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() 来获取单例实例。 【参考方案1】:

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

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

【讨论】:

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

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

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

【讨论】:

我在 del!.discoveredDeviceName(...) 之前进行检查,所以没关系

以上是关于即使在设置委托后协议也不起作用的主要内容,如果未能解决你的问题,请参考以下文章

free() 在 c 代码和代码中收集垃圾值即使在释放后将指针设置为 NULL 也不起作用

即使在安装 .NET 核心 SDK 后,Dotnet 命令也不起作用

为啥即使在 WKWebView 中设置 cookie 后 SSO 也不起作用?

即使设置了值,打印范围也不起作用

即使 contentSize 大于 frame 并且在设置内容大小之前添加了子视图,滚动视图也不起作用

地理定位即使在设备上也不起作用