将数据从一个选项卡控制器快速传递到另一个选项卡控制器

Posted

技术标签:

【中文标题】将数据从一个选项卡控制器快速传递到另一个选项卡控制器【英文标题】:passing data from one tab controller to another in swift 【发布时间】:2015-02-11 12:57:14 【问题描述】:

我的应用程序有三个 viewController 与 tabBar 的三个选项卡相关联。我想从第一个选项卡切换到第三个选项卡,并将一些数据从第一个视图控制器传递到第三个视图控制器。我不能用 segue 来做,因为 segue 在选定的选项卡中创建导航。那不是我的要求。我想在 tabBar 中切换选项卡并在没有任何导航的情况下传递一些数据。我该怎么做?

【问题讨论】:

这是一个使用单例 Swift 类在控制器之间共享数据的简洁示例:***.com/a/44380145/2162226 如果你不在标签根目录,你可以使用展开转场。 Here is an example. 【参考方案1】:

最新 Xcode 版本 8.3.3 中的 Swift 3

首先,您可以在FirstViewController 中设置标签栏委托UITabBarControllerDelegate。当您想通过单击UITabBarViewController 中的标签栏按钮将数据从一个视图控制器发送到另一个视图控制器时,可以使用此功能。

class FirstViewController: UIViewController ,UITabBarControllerDelegate 
    let arrayName = ["First", "Second", "Third"] 

    override func viewDidLoad() 
        super.viewDidLoad()

        self.tabBarController?.delegate = self
    

    func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool 
        if viewController.isKind(of: FirstsubsecoundViewController.self as AnyClass) 
            let viewController  = tabBarController.viewControllers?[1] as! SecondViewController
            viewController.arrayData = self.arrayName
         

        return true
    

在 SecondViewController 中获取数据:

class SecondViewController: UIViewController 
    var arrayData: [String] = NSArray()
    override func viewDidLoad() 
       super.viewDidLoad()
       print(arrayData) // Output: ["First", "Second", "Third"]
   

【讨论】:

【参考方案2】:

您可以使用以下代码:Objective C

[tab setSelectedIndex:2];

将您的数组保存在 NSUserDefaults 中,如下所示:

[[NSUserDefaults standardUserDefaults]setObject:yourArray forKey:@"YourKey"];

并使用NSUserDefaults 从另一个视图获取数据,如下所示:

NSMutableArray *array=[[NSUserDefaults standardUserDefaults]objectForKey:@"YourKey"];

迅速

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) 
      if segue.identifier == "toTabController" 
        var tabBarC : UITabBarController = segue.destinationViewController as UITabBarController
        var desView: CaseViewController = tabBarC.viewControllers?.first as CaseViewController

        var caseIndex = overviewTableView!.indexPathForSelectedRow()!.row
        var selectedCase = self.cases[caseIndex]

        desView.caseitem = selectedCase
      
    

【讨论】:

是的,我可以通过 self.tabBarController!.selectedIndex = 2 切换选项卡,但是如何将数据从第一个选项卡的控制器视图传递到第三个选项卡控制器视图?实际上我的第一个选项卡的控制器视图有一个按钮,单击按钮后,我想将一些数据传递给第三个选项卡的控制器视图。但如何? 你可以使用“NSUserDefaults”来保存deta。 yaa 这是一个很好的解决方案,但是有没有直接的方法而不在 NSUserDefaults 中全局存储数据?这个值会经常变化,如果有segue之类的方法就更好了。实际上,我试图从第一个控制器访问第三个控制器的变量(关键字),例如 - var thirdViewController:ThirdViewController = ThirdViewController() 和 thirdViewController.keyword = "Nuibb",但关键字变量在第三个视图控制器中总是为零。 @rcat24 我尝试使用单例,但有一些问题,正如我在上面的答案中描述的那样。你能告诉我我应该怎么做才能在单击按钮时多次获取单例对象的值,而不是一次? @Nuibb 将 viewDidLoad 中的代码替换为 viewWillAppear。【参考方案3】:

好的,我尝试在第一个选项卡的 viewController 中创建一个单例对象,然后从第三个 tabBar 的 viewController 获取该对象的值。当第三个选项卡的视图控制器第一次实例化时,它只工作一次。除了第一次,我从来没有在第三个选项卡的视图控制器中得到那个单例对象的值。我现在能做什么 ?在我的代码中 - 在第一个选项卡的控制器中,如果我单击一个按钮选项卡将切换到第三个选项卡。以下是我的代码部分-

在第一个选项卡的控制器中 -

@IBAction func sendBtnListener(sender: AnyObject) 
        Singleton.sharedInstance.brandName = self.searchDisplayController!.searchBar.text
        self.tabBarController!.selectedIndex = 2

在第三个标签的控制器中 -

 override func viewDidLoad() 
     super.viewDidLoad()

     //Nothing is printed out for this portion of code except the first time 
     if !Singleton.sharedInstance.brandName.isEmpty
         println(Singleton.sharedInstance.brandName)

     else

         println("Empty")
     
 

在单例对象的类中 -

class Singleton 
    var name : String = ""
    class var sharedInstance : Singleton 
        struct Static 
            static let instance : Singleton = Singleton()
        
        return Static.instance
    

    var brandName : String 
        get
            return self.name
        

        set 
            self.name = newValue
        
    
 

已编辑:

好吧,它终于工作了。对于像我一样想要的其他人,请在第三个选项卡(目标选项卡)控制器中将 viewDidLoad() 中的所有代码替换为 viewWillAppear() 方法,它将起作用。谢谢。

【讨论】:

以上是关于将数据从一个选项卡控制器快速传递到另一个选项卡控制器的主要内容,如果未能解决你的问题,请参考以下文章

将 UIView 从一个选项卡移动到另一个选项卡

无法在选项卡视图控制器之间共享数据?

当我在基于选项卡的应用程序中从一个控制器导航到另一个控制器时,tabBar 被隐藏

在特定条件下将数据从一个选项卡自动填充到另一个选项卡

使用选项卡控制器传递托管对象上下文

是否可以从标签栏控制器导航到另一个标签栏控制器?