我有两个视图控制器“ ViewController”和“ ChildViewController”。如果单击HomeButton,则它们之间的连接将通过segue进行。 segue标识符是“ parentToChild”。如果单击ChildButton,则信息将使用委派方法转到“ ViewController”。如果未在导航控制器中嵌入“ ChildViewController”,则所有这些操作均有效。 如果已嵌入,则在解包委托时(委托(!! 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”
答案 0 :(得分:1)
如果将其嵌入到NavigationController中,则此行代码将失败:
if let vc = segue.destination as? ChildViewController
目的地将不是ChildViewController
,而将是UINavigationController
,其根视图控制器是ChildViewController
。
如果它在导航控制器中,则应该可以进行以下操作:
if let nav = segue.destination as? UINavigationController,
let vc = nav.viewControllers.first as? ChildViewController {
vc.delegate = self
}