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

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

【问题讨论】:

标签: ios swift uiviewcontroller segue uitabbar


【解决方案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() 方法,它将起作用。谢谢。

    【讨论】:

      猜你喜欢
      • 2018-06-08
      • 2012-05-26
      • 1970-01-01
      • 1970-01-01
      • 2016-10-22
      • 1970-01-01
      • 1970-01-01
      • 2018-06-30
      • 1970-01-01
      相关资源
      最近更新 更多