Swift:当委托者类不是直接孩子时,分配委托类?

时间:2016-09-27 18:30:34

标签: ios swift delegates delegation

我正在创建一个使用一组向下钻取表的应用程序,每个表都有自己的TableViewController,所以我的故事板设置了一个MainViewController,它有一个到TableViewController(MainTable)的segue,它有一个到另一个TableViewController的segue (子表)。我创建了一个协议,现在我试图将SubTable指定为委托者,将MainTable指定为委托。我发现的所有解决方案只有在委托类被直接从委托类调用(或被调用)时才有效,在这种情况下,您可以在prepareForSegue方法中使用SubTable.delegate = self,但这并不是“{1}}。如果从委托类(MainView)中调用(创建)SubTable,则工作。对不起,如果这令人困惑,我很乐意澄清其中任何一个。这是我想要的一个例子:

class MainViewController: UIViewController, delegate {
    override func viewDidLoad() {        
        super.viewDidLoad()
        SubTable.delegate = self //Doesn't work
    }

    func acceptData(data: String!) {
        print(data)
    }
}

SubTable.delegate = self line不起作用,因为尚未创建SubTable,但如果我事先使用let instance = SubTable()然后instance.delegate = self创建它,那么它仍然无法工作,因为从MainTable到SubTable的segue创建了一个新的独立的SubTable实例。

protocol delegate {
    func acceptData(data: String!)
}

class MainTable: UITableViewController { 

}

class SubTable: UITableViewController {
    var delegate: delegate?

    func sendData() {
      self.delegate?.acceptData(data: "some text")
    }
}

1 个答案:

答案 0 :(得分:1)

您可以将代理传递给MainTable,并在创建SubTable时将其分配给那里。在MainTable中创建一个字段来存储它

var subTableDelegate : delegate?
MainViewController中的

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    let destinationVC = segue.destination as! MainTable
    destinationVC.subTableDelegte = self
}
MainTable中的

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    let destinationVC = segue.destination as! SubTable
    destinationVC.delegate = self.subTableDelegate
}