【问题标题】:Could not cast value of type 'UINavigationController' to 'UIViewController' in swift无法快速将“UINavigationController”类型的值转换为“UIViewController”
【发布时间】:2017-03-02 06:16:20
【问题描述】:

我的父视图控制器和子视图控制器都有一个导航控制器。子视图控制器转入另外两个视图控制器,即“UserLoginViewController”和“RegisterVC”。我希望 UserLogin 中的子视图按钮执行 Button 操作,该操作又执行涉及父视图控制器及其导航控制器的 segue。

这是我使用的代码:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if segue.identifier == Constants.embedSegue {
            let childViewController = segue.destinationViewController as! UserLoginViewController
            childViewController.delegate = self
        }
    }

从 parentVC 调用 UserLoginVC。

我收到一个错误提示

无法将 'UINavigationController' (0x109aa7860) 类型的值转换为 'Storey_Keeper.UserLoginViewController' (0x10645b810)。

帮助?

【问题讨论】:

  • 因为destinationViewController 是一个导航控制器。

标签: ios swift uinavigationcontroller


【解决方案1】:
 override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "segue_profile"
        {
            if let navigationController = segue.destination as? UINavigationController {
                let childViewController = navigationController.topViewController as? ProfileViewController
                childViewController?.userId = UserDefaults.standard.value(forKey: "userID") as! String
            }

        }
    }

【讨论】:

    【解决方案2】:

    试试这个:

     let nav = segue.destinationViewController as! UINavigationController
     let childViewController = nav.viewControllers[1] as! UserLoginViewController
    

    【讨论】:

    • 但 UserLoginViewController 不是我的 topViewController
    • 你试过了吗?
    • 无法将“Storey_Keeper.HomePageViewController”类型的值转换为“Storey_Keeper.UserLoginViewController”
    • Could not cast value of type 'Storey_Keeper.HomePageViewController' to 'Storey_Keeper.UserLoginViewController' 是我得到的错误
    • 检查您连接的 segue 连接并重试此代码。
    【解决方案3】:

    如果您的UserLoginViewController 嵌入到它自己的UINavigationController 中,segue.destinationViewController 将是一个UINavigationViewController

    你可以这样得到:

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if segue.identifier == Constants.embedSegue {
    
            if let navigationController = segue.destinationViewController as? UINavigationController {
                let childViewController = navigationController.topViewController as? UserLoginViewController
                childViewController?.delegate = self
            }
        }
    }
    

    我建议一般不要强制施放。

    【讨论】:

    • UserLoginViewController 不是该导航控制器的 topViewController。
    • 看看你是如何连接segue的。您如何展示 UserLoginViewController?模态还是推送?
    • 我通过推送呈现它。
    • 确保将 segue 连接到 UserLoginViewController ,而不是连接到包含它的导航控制器。
    • 仍然 UserLoginVC 不是连接到导航控制器的那个。它是堆栈中的第二个。
    猜你喜欢
    • 1970-01-01
    • 2017-11-17
    • 2023-03-23
    • 2021-09-29
    • 1970-01-01
    • 2015-08-29
    • 1970-01-01
    • 2016-01-04
    • 1970-01-01
    相关资源
    最近更新 更多