在swift中将数据从一个选项卡控制器传递到另一个

时间:2015-02-11 12:57:14

标签: ios swift uiviewcontroller segue uitabbar

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

3 个答案:

答案 0 :(得分:10)

  

最新Xcode版本8.3.3中的Swift 3

首先,您可以在UITabBarControllerDelegate中设置标签栏代理firstViewController。如果要通过单击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"]
   }
}

答案 1 :(得分:4)

您可以使用此代码:目标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
      }
    }

答案 2 :(得分:2)

好的,我尝试在第一个选项卡的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")
     }
 }

在Singleton Object的类中 -

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