我有两个 View Controller “ViewController”和“ChildViewController”。如果单击 HomeButton,它们之间的连接会随着 segue 发生。 segue 标识符是“parentToChild”。如果单击 ChildButton,则使用委托(delegate)方法将信息转到“ViewController”。如果“ChildViewController”未嵌入导航 Controller ,则所有这些都有效。 如果它是嵌入的,那么我在解包委托(delegate)时会出错(delegate!.buttonClickedByUser(word:“hello”))并且错误是“在解包可选值时意外发现 nil”
我的代码是这样的:
import UIKit
class ViewController: UIViewController, ChildToParentProtocol
{
func buttonClickedByUser(word: String) {
print(word)
}
override func viewDidLoad() {
super.viewDidLoad()
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let vc = segue.destination as? ChildViewController,
segue.identifier == "parentToChild" {
vc.delegate = self
}
}
}
import UIKit
protocol ChildToParentProtocol:class {
func buttonClickedByUser(word: String)
}
class ChildViewController: UIViewController {
weak var delegate:ChildToParentProtocol!
override func viewDidLoad() {
super.viewDidLoad()
}
@IBAction func childButtonClicked(_ sender: UIButton) {
delegate!.buttonClickedByUser(word: "hello")
}
}
即使 ChildViewController 嵌入在导航 Controller 中,我也希望打印“hello”
最佳答案
如果它嵌入到 NavigationController 中,这行代码将失败:
if let vc = segue.destination as? ChildViewController
目标将不是 ChildViewController
,而是 UINavigationController
,其 Root View Controller 是 ChildViewController
。
如果它在一个导航 Controller 中,这样的东西应该可以工作:
if let nav = segue.destination as? UINavigationController,
let vc = nav.viewControllers.first as? ChildViewController {
vc.delegate = self
}
关于ios - 如何从嵌入在导航 Controller 中的 View Controller 接收信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57921910/