【发布时间】:2019-09-13 10:29:04
【问题描述】:
我有两个视图控制器“ViewController”和“ChildViewController”。如果单击 HomeButton,它们之间的连接会通过 segue 发生。 segue 标识符是“parentToChild”。如果单击 ChildButton,则使用委托方法将信息转到“ViewController”。如果“ChildViewController”没有嵌入到导航控制器中,所有这些都有效。 如果它是嵌入的,那么我在展开委托 (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 嵌入到导航控制器中,我也希望打印“hello”
【问题讨论】:
-
if let vc = segue.destination as? ChildViewController,返回 false,对吗?然后,做if let navVC = segue.destination as? UINavigationController, let childVC = navVC. viewControllers.first as? ChildViewController {}