如何从导航控制器中嵌入的View Controller接收信息

时间:2019-09-13 10:29:04

标签: ios swift

我有两个视图控制器“ 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”

1 个答案:

答案 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
}