【问题标题】:Pass data between ViewController and TabBarController在 ViewController 和 TabBarController 之间传递数据
【发布时间】:2017-01-22 11:55:23
【问题描述】:

我有几个问题。 如何将数据(我在 Alamofire 请求完成后得到的)传递给 TabBarController 的一个孩子?

我遇到的第一个问题是我无法覆盖登录操作中的 func prepareForSegue(当点击按钮时),它说我只能覆盖类成员。但是如果我把函数放在 IBAction 之外,我就不会发送我需要的数据了。

第二个问题是,当我将覆盖的函数放在 IBAction 之外时,代码如下所示:

 override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {

            let homeVC = segue.destinationViewController as HomeViewController
            homeVC.templateForCell = templates
        }

当我运行它时,我得到了错误:

无法将“UITabBarController”类型的值转换为 HomeViewController'

(HomeViewController 是我的目标视图,我应该从 Alamofire 传递数据)。

【问题讨论】:

  • 您可以查看UITabBarControllerviewControllers 属性,看看它们是否是您需要发送到的对象。

标签: ios swift uiviewcontroller uitabbarcontroller


【解决方案1】:

您不一定需要为此使用 prepareForSegue。只需在您想要的 TabBarController viewControllers 数组中引用哪个 ViewController 并进行转换。

let vc = self.tabBarController.viewControllers![1] as! HomeViewController
vc.templateForCell = templates

如果您的 TabBar 中的 ViewControllers 嵌入在 Navigation Controllers 中,您可以这样做:

let navController = self.tabBarController.viewControllers![1] as! UINavigationController
let vc = navController.topViewController as! HomeViewController
vc.templateForCell = templates

【讨论】:

  • 但我收到错误“致命错误:在展开可选值时意外发现 nil”
  • 把这段代码放到 viewDidLoad 中,看看 xcode 打印了什么:print(tabBarController?.viewControllers)
  • 当您想将数据从标签栏传递到视图控制器之一时,这将起作用但是如何将数据从嵌入导航的视图控制器传递到标签栏?
  • @nighttalker 我得到了零。但解决方案是,对于未来的任何人,不要使用 self.tableBarController,只需使用 self.viewcontrollers。
【解决方案2】:

对于 Xcode 8、Swift 3.x,您可以使用以下内容。这假设您将视图控制器嵌入到导航控制器中。在我的情况下,我试图在从新用户设置视图导航时将名为 startWizard 的变量设置为 true。

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if (segue.identifier == "segueFromNewUserToDashboard") {
        let dashboardController = segue.destination as! MyTabBarController
        for viewController in dashboardController.viewControllers! {
            let navViewController = (viewController as! MyNavigationController).topViewController!
            if (navViewController.isKind(of: DashboardViewController.self) == true) {
                (navViewController as! DashboardViewController).startWizard = true
                break
            }
        }
    }
}

【讨论】:

    【解决方案3】:

    更改标签栏选择的索引并将数据发送到该 ViewController

    tabBarController!.selectedIndex = 2
    let navVC = tabBarController!.viewControllers![2] as! UINavigationController
    
    let SV = navVC.topViewController as! SearchViewController
    SV.selectedIndex = indexPath.row
    

    【讨论】:

    • 这不能回答问题
    • 这里 SearchViewController 是具有变量 selectedIndex 的新视图控制器,此代码将数据 (indexPath.row) 传递给下一个视图控制器 (search view controller) 到其变量 (selectedIndex)。跨度>
    【解决方案4】:

    你可以从 TabController 类(父类)中做这样的事情:

    var maleVC: MaleOptionsViewController! //First child 
    var femaleVC: FemaleOptionsViewController! //Second child
    
    override func viewDidLoad() {
        super.viewDidLoad()
        maleVC = self.viewControllers![0] as? MaleOptionsViewController //Reference to first child
        femaleVC = self.viewControllers![1] as? FemaleOptionsViewController //Reference to second child
    }
    

    并像这样传递数据:

    override func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem) {
            maleVC.cartTableView?.reloadData() //Where cartTableView is an IBOutlet or even a variable for that matter
            femaleVC.cartTableView?.reloadData() //Same thing as the comment ^
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-05
      • 1970-01-01
      • 2020-08-23
      相关资源
      最近更新 更多