无法使用委托快速调用另一个类方法

时间:2019-02-13 07:41:43

标签: ios swift function delegates

我正在尝试在按钮轻击事件中从类A调用类B的方法。但这不起作用,下面是我的代码。

// Viewcontroller
class ViewController: UIViewController {
   @IBAction func btnClicked(_ sender: Any) {
        var objA = A()
        objA.delegate?.TestA()
    }
}

// ClassA.swift
protocol TestA {
    func TestA()
}

class A {
    var delegate: TestA?
}


// ClassB.swift
class B : TestA {
    func TestA() {
        print(" Function A from b")
    }
}

点击按钮时,函数TestA()不会调用。

我什至尝试了下面的代码,但是也没有用:

var objB = B()
var objA = A()
objA.delegate = objB

3 个答案:

答案 0 :(得分:1)

因为您使用实例化了Class A实例

    var objA = A()

很显然,您尚未在delegate中初始化A属性,因为它的可选值为默认值nil

现在打电话时

    objA.delegate?.TestA()

delegate为零,因此不会调用函数TestA

建议

始终使用camelCasing声明函数名称。因此TestA()是不正确的,请使用testA()

编辑1:

对此进行了测试

@IBAction func btnClicked(_ sender: Any) {
    let objA = A()
    let objB = B()
    objA.delegate = objB
    objA.delegate?.TestA()
}

这很好,这是什么问题?

答案 1 :(得分:1)

objA.delegate从未分配给对象,因此其初始值为nil。 ?运算符避免在nil对象上调用函数。

答案 2 :(得分:0)

Sandeep Bhandari的答案是正确的。

一些信息,可以更好地理解礼宾和代表。 TestAprotocol,并且在var delegate中定义了可选的class A。此设置是正确的。此设置背后的想法是,class A的任何用户(在这种情况下,符合class B的{​​{1}}都将从protocol TestA进行回调。您需要从class A内部调用delegate.testA()函数。 class A的当前实现根本无法从定义协议和委托中受益。

为实现正确使用,请对ViewController出租车进行如下修改:

class A

并按如下所示修改protocol TestA { func testA() } class A { var delegate: TestA? func process() { // Do something and call delegate function to report it. delegate?.testA() } } (为完整性起见复制ViewController):

class B

当调用class ViewController: UIViewController { @IBAction func btnClicked(_ sender: Any) { var objA = A() var objB = B() objA.delegate = objB objA.process() } } // ClassB.swift class B : TestA { func TestA() { print(" Function A from b") } } 的{​​{1}}上的class B函数时,将调用在protocol TestA中实现的符合process()的函数。 这是协议和代理的更好使用。希望这会有所帮助。