我有2 UIViewController
:MainViewController
- > CreateNewViewController
。
tableView
包含在MainViewController
中。我已将dataSource
的{{1}}和delegate
与tableView
联系起来。我还将一个插座连接到MainViewController
。
在MainViewController
中,我会这样:
CreateNewViewController
初始化override func viewDidLoad() {
super.viewDidLoad()
_ = MainViewController.init(nibName: nil, bundle: nil, createNewViewController: self)
// Do any additional setup after loading the view.
}
的初始化委托属性:
MainViewController
我正在尝试使用协议func更新init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?, createNewViewController : CreateNewViewController) {
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
createNewViewController.createNewCallBack = self
}
。我不明白为什么tableView
从tableView
返回时会nil
为CreateNewViewController
。这是回调函数:
func addNewBook(book: Book) {
self.books.append(book)
self.tableView.reloadData()
}
非常感谢任何帮助!
答案 0 :(得分:1)
您正在尝试将代理设置在错误的位置。 根据有关准备方法的文档:
此方法的默认实现不执行任何操作。子类 覆盖此方法并使用它来配置新的视图控制器 在它显示之前。 segue对象包含信息 关于转换,包括对两个视图控制器的引用 参与其中。
您必须实现此方法:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let myViewController = segue.destination as? CreateNewViewController {
myViewController.createNewCallback = self //this set the delegate
}
}
答案 1 :(得分:0)
根据你的描述,你有一个从MainVC到CreateNewVC的segue。
在CreateNewVC的viewDidLoad
中,您似乎正在尝试将CreateNewVC的委托设置为MainVC。但是,这不是正确的方法。
您应该在呈现CreateNewVC
之前,在MainVC的prepareForSegue
方法中执行此。
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let vc = segue.destination as? CreateNewViewController {
vc.createNewCallback = self
}
}