【问题标题】:How to cast the first view of a uinavigationview controller如何投射 uinavigationview 控制器的第一个视图
【发布时间】:2025-12-07 10:10:01
【问题描述】:

我一直在按照 firebase 教程创建自己的聊天应用程序,我正在尝试从包含表格视图的 uiviewcontroller 访问 chatviewcontroller。 Viewcontroller 嵌入在导航控制器中。选择单元格时如何调出聊天视图控制器?

这是我的代码:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    super.prepare(for: segue, sender: sender)

    //retrieve the destination view controller
    let navVc = segue.destination as! UINavigationController

    let channelVc = navVc.viewControllers.chatViewController as! ViewController

    // set the senderDisplayName in Viewcontroller to the email provided in the email field by the user

    channelVc.senderDisplayName = userEmailTextField?.text
}

Here is the error msg

【问题讨论】:

  • 我强烈建议正确使用可选项,而不是不加限制地强制展开。

标签: ios swift xcode firebase firebase-authentication


【解决方案1】:

假设您的 ChatViewController 是导航控制器的根视图控制器,您应该将代码更改为:

let channelVc = navVc.viewControllers.first as! ChatViewController

navVC.viewControllers 是由 UINavigationController 管理的 UIViewControllers 的数组,因此该数组不会有名为 chatViewController 的属性,除非您实现了一些自定义。

编辑:将所有内容放在一起,并演示如何安全地打开这些选项,您的 prepareForSegue 应该如下所示:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    super.prepare(for: segue, sender: sender)
    if let navVc = segue.destination as? UINavigationController, let channelVc = navVc.viewControllers.first as? ChatViewController {
        //Now you have a reference to your ChatVC, and you can set the DisplayName
        channelVc.senderDisplayName = userEmailTextField?.text
    }
}

【讨论】:

  • 我会用什么文件来实现这个?视图控制器(包含表格视图,嵌入在导航控制器中)或登录视图控制器(一旦通过身份验证就转到视图控制器)?
  • @NnamdiAffia 我添加了一个编辑来告诉你在哪里做这个。您在最初的实现中非常接近。
  • 感谢编辑,当我选择一个单元格时它仍然崩溃。我已经编辑了我的帖子以显示错误消息。请帮忙
  • 我需要查看更多代码和故事板设置才能知道发生了什么。当它崩溃时,您需要滚动到调试器崩溃代码的顶部以查看实际的错误消息是什么。您的屏幕截图仅显示底部,因此我没有看到任何有用的信息。
  • 它有效!!!!!!! Chatviewcontroller 不是根,视图控制器是。我刚刚在您的编辑中用 viewcontroller 替换了 chatviewcontroller!你是个天才,加油!!!!
【解决方案2】:

你必须从UINavigationController获取第一个视图控制器:

let channelVc = navVc.viewControllers.first as! ChatViewController

【讨论】:

  • 我已经尝试了好几次,但是当我选择一个单元格时它总是崩溃。我认为这是因为我在故事板上还有其他几个视图控制器。我还将视图控制器嵌入到导航控制器中,然后将单元格中的 segue 连接到 chatviewcontroller。
最近更新 更多