使用委托和协议模式发送数据时意外发现 nil
Unexpectedly found nil when sending data with Delegates and protocols pattern
我有 2 个视图控制器,firstVC 和 secondVC。
我想从第一个发送数据来更新 secondVC 的变量和 UI。
当在 didSelectRowAt 中点击它时,我想用委托发送 tableView 的 indexPath.row。
This is what I try, but when selecting a row the app crashes with error:
Unexpectedly found nil while implicitly unwrapping an Optional value
我尝试调试并看到委托为 nil,即使我放置了一个使委托成为 firstVC 的方法。
第二VC:
func setupDelegate() {
let FirstVC = storyboard?.instantiateViewController(identifier: "FirstVC") as! FirstVC
FirstVC.selectionDelegate = self
}
}
extension SecondVC: setSelectionDelegate {
//this is never executed
func didChoose(index: Int) {
lbl.text = String(index)
}
}
第一VC:
protocol setSelectionDelegate {
func didChoose(index: Int)
}
var selectionDelegate: setSelectionDelegate!
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let secondVC = UIStoryboard.init(name: "Main", bundle: Bundle.main).instantiateViewController(withIdentifier: "secondVC") as? secondVC
secondVC?.setupDelegate()
self.selectionDelegate.didChoose(index: indexPath.row)
}
每次您显式调用 instantiateViewController
时,您都会得到一个 new 视图控制器实例,这与您在 device/simulator.
使用故事板转场(嵌入或模态呈现...),您有 override prepare(...)
函数来获取对所需视图控制器实例的引用。
我有 2 个视图控制器,firstVC 和 secondVC。
我想从第一个发送数据来更新 secondVC 的变量和 UI。
当在 didSelectRowAt 中点击它时,我想用委托发送 tableView 的 indexPath.row。
This is what I try, but when selecting a row the app crashes with error:
Unexpectedly found nil while implicitly unwrapping an Optional value
我尝试调试并看到委托为 nil,即使我放置了一个使委托成为 firstVC 的方法。
第二VC:
func setupDelegate() {
let FirstVC = storyboard?.instantiateViewController(identifier: "FirstVC") as! FirstVC
FirstVC.selectionDelegate = self
}
}
extension SecondVC: setSelectionDelegate {
//this is never executed
func didChoose(index: Int) {
lbl.text = String(index)
}
}
第一VC:
protocol setSelectionDelegate {
func didChoose(index: Int)
}
var selectionDelegate: setSelectionDelegate!
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let secondVC = UIStoryboard.init(name: "Main", bundle: Bundle.main).instantiateViewController(withIdentifier: "secondVC") as? secondVC
secondVC?.setupDelegate()
self.selectionDelegate.didChoose(index: indexPath.row)
}
每次您显式调用 instantiateViewController
时,您都会得到一个 new 视图控制器实例,这与您在 device/simulator.
使用故事板转场(嵌入或模态呈现...),您有 override prepare(...)
函数来获取对所需视图控制器实例的引用。