我正在创建一个使用一组向下钻取表的应用程序,每个表都有自己的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")
}
}
答案 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
}