通过Swift中的委托关闭视图控制器

时间:2018-03-17 14:34:24

标签: ios swift

我有以下协议:

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)
}

然后它按预期自行解除,表明函数已正确映射到按钮。

如何从另一个班级解雇我的视图控制器?

2 个答案:

答案 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"