【问题标题】:How to pass data from ViewController to a ViewController in a tab bar iOS?如何将数据从 ViewController 传递到标签栏 iOS 中的 ViewController?
【发布时间】:2017-11-05 01:01:05
【问题描述】:

我正在尝试将数据从我的主 ViewController 传递到选项卡栏中的另一个 ViewController。

我尝试使用下面的代码,得到一个错误Could not cast value of type 'Test.FirstViewController''Test.ViewController'

override func viewWillAppear(_ animated: Bool)
{
    super.viewWillAppear(animated)
    let tab1Controller = self.tabBarController?.viewControllers?.first as! ViewController
    print(tab1Controller.test)
}

【问题讨论】:

  • @matt 如果我将其设置为as! FirstViewController,那么我将无法访问ViewController 中的变量,关键是我想将数据从ViewController 传递给视图控制器标签栏。

标签: ios swift uiviewcontroller uitabbar


【解决方案1】:

我刚刚使用了以下代码,它在 Xcode 9 和 swift 4.0 上运行良好。下面的方法是在 View Controller 类中声明的,它只显示了第一个 View Controller。

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "sendingToTabBar" {
        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        let tabVC = storyboard.instantiateViewController(withIdentifier: "tabVC") as! UITabBarController
        self.present(tabVC, animated: true, completion: {
            let vc = tabVC.selectedViewController as! FirstViewController
            vc.dataLBL.text = self.dataTF.text!
        })
    }
}

【讨论】:

    【解决方案2】:

    您可以在 ViewController prepare 方法中访问标签栏控制器并设置您的值。

    准备继续

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        let barViewControllers = segue.destination as! UITabBarController
        let destinationViewController = barViewControllers.viewControllers?[0] as! FirstViewController
        destinationViewController.test = "Hello TabBar 1"
    
        // access the second tab bar
        let secondDes = barViewControllers.viewControllers?[1] as! SecondViewController
        secondDes.test = "Hello TabBar 2"
    }
    

    然后在你的标签栏 ViewControllers 声明变量,你要设置的值。

    @IBOutlet weak var label: UILabel!
    var test: String?
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        label.text = test
    }
    

    FirstViewController

    SecondViewController

    【讨论】:

      【解决方案3】:

      你可以做很多事情,我要做的就是创建一个全局变量,以便两个视图控制器都可以访问它。另一种选择是给每个视图控制器一个单独的全局变量,当视图加载时,将该变量设置为self,然后制作一个可以被另一个视图控制器设置的变量。

      示例:

      var data:Any?
      viewDidLoad() {
          viewControllerA = self
      }
      

      【讨论】:

        猜你喜欢
        • 2021-01-17
        • 1970-01-01
        • 2012-08-10
        • 2017-11-08
        • 2021-05-04
        • 2014-07-17
        • 1970-01-01
        • 1970-01-01
        • 2017-02-22
        相关资源
        最近更新 更多