我正在尝试在按钮轻击事件中从类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
答案 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的答案是正确的。
一些信息,可以更好地理解礼宾和代表。
TestA
是protocol
,并且在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()
的函数。
这是协议和代理的更好使用。希望这会有所帮助。