如何从嵌入在导航控制器中的视图控制器接收信息

Posted

技术标签:

【中文标题】如何从嵌入在导航控制器中的视图控制器接收信息【英文标题】:How to receive information from View Controller which is embed in Navigation Controller 【发布时间】: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 【参考方案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

【讨论】:

以上是关于如何从嵌入在导航控制器中的视图控制器接收信息的主要内容,如果未能解决你的问题,请参考以下文章

如何快速隐藏嵌入在导航堆栈中的视图控制器中的选项卡栏?

如何从“菜单”视图控制器在现有 UIViewControllers 之间导航?

如何使用 prepareForSegue 方法从视图控制器推送到导航视图控制器?

将信息从 UINavigationController 传递到嵌入式 UIViewController

如何从 segue 中的另一个视图控制器实例化导航和选项卡控制器(显示详细信息)?

如何使用情节提要正确地转到嵌入式选项卡栏和导航控制器?