我有 2 个UIViewController
:MainViewController
-> CreateNewViewController
。
tableView
包含在MainViewController
中。我已经将dataSource
和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.
}
Init in MainViewController
将初始化委托属性:
init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?, createNewViewController : CreateNewViewController) {
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
createNewViewController.createNewCallBack = self
}
我正在尝试使用协议函数更新tableView
。我不明白为什么tableView
从CreateNewViewController
回来时会nil
.这是回调函数:
func addNewBook(book: Book) {
self.books.append(book)
self.tableView.reloadData()
}
任何帮助将不胜感激!
您正在尝试将委托设置在错误的位置。根据有关准备方法的文档:
此方法的默认实现不执行任何操作。子 重写此方法并使用它来配置新的视图控制器 在显示之前。segue 对象包含信息 关于转换,包括对两个视图控制器的引用 涉及的。
您必须实现此方法:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let myViewController = segue.destination as? CreateNewViewController {
myViewController.createNewCallback = self //this set the delegate
}
}
根据你的描述,你有一个从MainVC到CreateNewVC的续集。
在 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
}
}