无法转换“UINavigationController”类型的值

Posted

技术标签:

【中文标题】无法转换“UINavigationController”类型的值【英文标题】:Could not cast value of type 'UINavigationController' 【发布时间】:2015-05-13 08:32:06 【问题描述】:

我正在为我的应用程序实现一个搜索接口,所以基本上我会将搜索关键字从一个 ViewController 传递到另一个 ViewController。

我已经多次完成这种类型的参数传递,但这次似乎有些奇怪。目标 ViewController 嵌入在 Navigation Controller 中。

现在代码看起来像这样。

override func prepareForSegue(segue: UIStoryboardSegue?, sender: AnyObject!) 
    if (segue?.identifier == "home_to_search") 

       var searchKeyword = txtSearchBarHome.text
       var svc = segue?.destinationViewController as! SearchViewController;
       svc.toPassSearchKeyword = searchKeyword;

       //let nav = segue?.destinationViewController as! UINavigationController
       //let svc = nav.topViewController as! SearchViewController
       //svc.toPassSearchKeyword = searchKeyword;
    

我已经探索过这些问题 DestinationViewController Segue and UINavigationController swift, How do I segue values when my ViewController is embedded in an UINavigationController? 没有运气。

让我感到奇怪的是,我已经在导航控制器中嵌入了 ViewController,我可以通过 segueing 传递参数。但是,在这种情况下,它会引发 Could not cast value of type 'UINavigationController' 错误。如果我尝试上面的注释代码,它不会在那里抛出错误,而是在 AppDelegate 类中抛出错误。

【问题讨论】:

当我没有在 UIViewController 或 UINavigationController 的界面构建器中设置自定义类时,有时会遇到这种情况。在界面生成器中选择项目时检查第三个选项卡并检查您是否已正确设置。 首先,谢谢。但我从故事板上查了一下,它似乎指出了正确的课程。 听起来如果你推送到一个导航控制器,你可能需要让子视图控制器(你的搜索视图控制器)向它传递一个值。这有意义吗?编辑:对不起,我看到你注释掉的代码。这正是我会做的。我会调查,看看我是否能找到问题。它在 appdelegate 上抛出了什么错误? 我发现了问题。 UI 中缺少映射,该映射与注释代码配合良好。还有另一个问题,但似乎这个问题现在已经解决了。请将其转换为答案,以便我将其标记为已解决。非常感谢您指出正确的方向。 【参考方案1】:

回答我自己的问题。在这种情况下,我们需要通过执行以下操作来访问子视图:

let nav = segue?.destinationViewController as! UINavigationController
let svc = nav.topViewController as! SearchViewController
svc.toPassSearchKeyword = searchKeyword;

【讨论】:

遇到了同样的问题,但由于我有多个 segue,我必须先检查类的类型。 segue.destinationViewController.isKindOfClass(UINavigationController) 谢谢!这目前是 Apple 在第 551 页的“使用 Swift 开发应用程序”中的一个问题,当时他们要求您将 segue.destination 向下转换为! AddEditEmojiTableViewController,忘记了两者之间有一个导航控制器。我注意到这本书的质量随着我的阅读而变得更糟,它开始非常扎实,现在其中一些在接近尾声时变得可疑 - 有意或无意。 这对我也有帮助。大多数指南都忘记了这部分! @Othyn 我正在看同一个教程,现在因为同样的事情而出现在这个 *** 问题中:) 你可以很好地看待它,它教我们如何解决这些问题各种错误。对于像我这样的新手来说,这不是微不足道的,但是解决它感觉很好,虽然它可能很简单:P【参考方案2】:

根据 Semih 的回答,如果您不想使用标识符,也可以这样做以将变量传递给下一个 segue:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
    if let nav = segue.destination as? UINavigationController, 
        let vc = nav.topViewController as? TestViewController 
        vc.username = "Test"
    

【讨论】:

【参考方案3】:

对于那些关注此问题的人来说,它已被重命名为 Destination

let nav = segue.destination as! UINavigationController
let svc = nav.topViewController as! SearchViewController
svc.toPassSearchKeyword = searchKeyword;

【讨论】:

以上是关于无法转换“UINavigationController”类型的值的主要内容,如果未能解决你的问题,请参考以下文章

UINavigationController

UINavigationController 风格

全屏显示 ViewController

多控制器

UINavigationControllerDelegate 不起作用

viewController 出现时出现黑色