ios - 如何从嵌入在导航 Controller 中的 View Controller 接收信息

标签 ios swift

我有两个 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/

相关文章:

ios - UIImagePickerController: didFinishPickingMediaWithInfo 未被调用

ios - 如何使用 Swift 将 Float uniform 传递给 iOS Metal 着色器?

ios - Cordova App -> iOS 存档验证失败。图标不见了

ios - PDF 文件无法在 UIDocumentInteractionController 中打开

ios - 带有图像的 UIActionSheet

swift - 为什么 UITableViewCell 宽度小于 UITableView 宽度

string - SWIFT: "Compressed"/小字符串类型?每个字符 1 个字节?

ios - 验证 uitextbox,使其仅发回 0.5 到 24 之间的数字

php - 从带有 PHP 的 ios 到 mySQL

swift - 为什么不能为计算属性定义属性观察器?