我有以下协议:
protocol MyDelegate: class {
func closeViewController()
}
protocol MyProtocol: class {
weak var delegate: SomeClass? {get set}
}
以下课程:
class SomeClass: MyDelegate {
var myViewController: UIViewController
init(myViewController: UIViewController){
self.myViewController = myViewController
self.myViewController.delegate = self
}
func closeViewController() {
myViewController.dismiss(animated: true, completion: nil)
}
}
这里的想法是SomeClass采用视图控制器并将自己设置为视图控制器的委托。
View控制器的定义如下:
class SomeViewController: UIViewController, MyProtocol {
weak var delegate: SomeClass?
...
@IBAction func close(_ sender: Any) {
delegate?.closeViewController()
}
...
}
其中close函数映射到storyboard中的关闭按钮。
我在另一个视图控制器中初始化SomeClass和我的视图控制器。
var someViewController = // initialized here
var someClass = SomeClass(myViewController: someViewController)
self.present(someViewController, animated: true, completion: nil)
然而,当我按下关闭按钮时,根本没有任何事情发生。视图控制器不会解散。
另一方面,如果我将ViewController中的close()函数更改为:
@IBAction func close(_ sender: Any) {
self.dismiss(animated: true, completion: nil)
}
然后它按预期自行解除,表明函数已正确映射到按钮。
如何从另一个班级解雇我的视图控制器?
答案 0 :(得分:1)
您已将delegate
属性声明为弱,并且没有SomeClass
对象的强引用。截止按钮回调时对象应为nil
,永远不会调用closeViewController()
。
答案 1 :(得分:-1)
如果我可能会建议你做的比这更复杂。我完全放弃了protocol
,只是实现了一个简单的委托模式。
class SomeViewController {
func close() {
print("did close")
}
}
class SomeObject {
weak var delegate: SomeViewController?
func close() {
delegate?.close()
}
}
let viewController = SomeViewController()
let object = SomeObject()
object.delegate = viewController
object.close() // prints "did close"