具有自定义委托的类

时间:2017-09-13 13:21:24

标签: ios swift delegates

我正在一个类中创建一个自定义委托,并尝试在我的控制器中实现该协议。 但是因为代表是零而无法工作。 我就是这样做的:

BluetoothOperations.swit

protocol GetWatchCollectedData:NSObjectProtocol {
    func getWatchCollectedData(COMMAND_ID : UInt8, data : NSData)
}

class BluetoothOperations: NSObject{
    var getWatchCollectedData: GetWatchCollectedData?

    func customFunc(){
        getWatchCollectedData.getWatchCollectedData(ID,Data)
    }
}

SomeController.swift

class SomeController: UIViewController {
   let object = BluetoothOperations()

   override func viewDidLoad() {
        super.viewDidLoad()
        object.getWatchCollectedData = self

    }
}

extension SomeController: GetWatchCollectedData{
    func getWatchCollectedData(COMMAND_ID : UInt8, data : NSData){
        print("delegate working.")
    } 
}

我还尝试制作一个类的对象,并在viewDidLoad中指定BluetoothOperations's object. getWatchCollectedData = self但是没有用。

知道我做错了吗? 感谢。

2 个答案:

答案 0 :(得分:2)

您的代码看起来是正确的。这是它可能失败的可能原因。在SomeController,您正在从object班级创建BluetoothOperations并正确分配代表。

但是,您必须确保控制器中定义的对象正在发送委托调用。您可能正在使用BluetoothOperations的另一个实例并且实际上正在使用该实例,并且在该实例中,代理未设置。

检查此方法的最简单方法是手动触发您在视图控制器中创建的对象中的委托。请尝试以下代码以查看代理是否被触发。

class SomeController: UIViewController {
   let object = BluetoothOperations()

   override func viewDidLoad() {
        super.viewDidLoad()
        object.getWatchCollectedData = self
        object.customFunc()// Trigger the delegate function here
    }
}

extension SomeController: GetWatchCollectedData{
    func getWatchCollectedData(COMMAND_ID : UInt8, data : NSData){
        print("delegate working.")
    } 
}

答案 1 :(得分:1)

您已正确实现了委托,但未在正确的类之间实现

由于您在BluetoothOperations以及其他View控件中创建了SomeController的对象,请说SomeController1

现在代表只负责相关的课程

`BluetoothOperations` (Call `customFunc`)     ---->  `SomeController1`
`BluetoothOperations`  (Call `customFunc`)    ---->  `SomeController`

你正在尝试这样

 `SomeController1  ---> `BluetoothOperations` (Call `customFunc`)  ----> SomeController`

这不可能通过这种方式实现,

由于您的SomeController1SomeController无法从任何地方连接

很难为您提供答案

您在SomeController1SomeController之间创建委托。

希望你能清楚