我的应用程序有三个与tabBar的三个tab关联的viewController。我想从第一个选项卡切换到第三个选项卡,并将一些数据从第一个视图控制器传递到第三个视图控制器。我不能用segue来做,因为segue在所选标签内创建导航。那不是我的要求。我想在tabBar中切换选项卡并传递一些数据而不进行任何导航。我该怎么办?
答案 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()方法,它将起作用。感谢。