我的应用程序有三个与tabBar的三个标签关联的viewController。我想从第一个标签切换到第三个标签,并将一些数据从第一个视图控制器传递到第三个视图控制器。我无法使用segue实现它,因为segue会在所选标签中创建导航。这不是我的要求。我想在tabBar中切换标签并传递一些数据,而不需要任何导航。我该怎么做?
最新的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"]
}
}
[tab setSelectedIndex:2];
像这样将数组保存在NSUserDefaults
中:
[[NSUserDefaults standardUserDefaults]setObject:yourArray forKey:@"YourKey"];
使用NSUserDefaults
从另一个视图获取数据,代码如下:
NSMutableArray *array=[[NSUserDefaults standardUserDefaults]objectForKey:@"YourKey"];
swift
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
}
}
好的,我尝试在第一个选项卡的视图控制器中创建一个单例对象,然后从第三个选项卡的视图控制器中获取该对象的值。它只在第三个选项卡的视图控制器实例化时有效。除了第一次以外,我从未在第三个选项卡的视图控制器中获取到该单例对象的值。现在该怎么办?在我的代码中 - 在第一个选项卡的控制器中,如果我点击一个按钮,就会切换到第三个选项卡。以下是我的代码部分 -
在第一个选项卡的控制器中 -
@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()方法之间的所有代码替换,它就会起作用了。谢谢。