【问题标题】:Could not cast value of type 'UITabBarController' to 'ViewController'无法将“UITabBarController”类型的值转换为“ViewController”
【发布时间】:2017-11-24 21:39:56
【问题描述】:

情况:当我在rentViewController中按下一个按钮时,它会弹出一个tableviewcontroller。如果按下了特定的单元格,它会将数据发送到rentViewController。为了将数据从一个视图控制器发送到另一个我需要代码

let rentViewController : RentViewController = self.presentingViewController as! RentViewController

这样 tableviewcontroller 就可以从rentviewcontroller 访问变量和函数。我正在使用

self.dismiss(animated: true, completion: nil)

离开 tableviewcontroller 并返回rentviewcontroller。但是,它给了我一个错误“无法将'UITabBarController'类型的值转换为'RentViewController'”。我做了一些研究,我认为这是根据我的视图控制器的命令,但我不确定如何以它的工作方式更改它。我的初始视图是“TabBarController”,之后的顺序是“NavigationController”->“RentViewController”->“TableViewController”。如果您有任何问题,请随时提出,我可以为您提供更多信息。

【问题讨论】:

    标签: ios swift uinavigationcontroller uitabbarcontroller


    【解决方案1】:

    您的 viewController 正在从 UITabBarController 呈现。通过您使用的方法,我相信您可以像这样访问它(其中索引是包含 RentVC 的 UINavigationController 的 UITabBarController 中的索引):

    if let tab = self.presentingViewController as? UITabBarController, 
        let nav = tab.viewControllers?[index] as? UINavigationController,     
        let rentViewController = nav.viewControllers.first as? RentViewController {
    
            rentViewController.data = data
    }
    

    但是,我建议在这种情况下使用委托或回调块来传递数据。

    对于委托方法,首先创建协议:

    protocol PassDataDelegate:class {
        func passData(data:YourType)
    }
    

    然后在 TableViewController 中:

    class TableViewController: UIViewController {
        weak var delegate: PassDataDelegate?
    }
    

    在 RentViewController 中:

    extension RentViewController: PassDataDelegate {
        func passData(data:YourType) {
            //use data to suit your needs
        }
    }
    

    在呈现 TableViewController 之前,在 RentViewController 中设置它的委托:

    tableViewController.delegate
    present(tableViewController, animated: true)
    

    最后,在 TableViewController 内部,在关闭之前,调用委托的方法来传递数据:

    delegate?.passData(data: <<someData>>)
    

    【讨论】:

    • 尝试了第一种方法,成功了!非常感谢。您建议使用委托传递数据的原因是什么?
    • 依赖调用顺序更简洁。例如,如果稍后您决定从应用程序的不同点呈现 TableViewController,委托仍然可以工作,而根据层次结构可能不会。
    猜你喜欢
    • 1970-01-01
    • 2015-08-17
    • 1970-01-01
    • 1970-01-01
    • 2017-01-06
    • 1970-01-01
    • 1970-01-01
    • 2016-12-07
    • 1970-01-01
    相关资源
    最近更新 更多