在 swift 中将数据从一个选项卡控制器传递到另一个
passing data from one tab controller to another in swift
我的应用程序有三个 viewController 与 tabBar 的三个选项卡相关联。我想从第一个选项卡切换到第三个选项卡,并将一些数据从第一个视图控制器传递到第三个视图控制器。我不能用 segue 来做,因为 segue 在选定的选项卡中创建导航。那不是我的要求。我想在 tabBar 中切换选项卡并在没有任何导航的情况下传递一些数据。我该怎么做?
您可以使用此代码:Objective C
[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
}
}
好的,我尝试在第一个选项卡的 viewController 中创建一个单例对象,然后从第三个选项卡栏的 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 -
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() 方法,它将起作用。谢谢
Swift 3 in latest Xcode version 8.3.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"]
}
}
我的应用程序有三个 viewController 与 tabBar 的三个选项卡相关联。我想从第一个选项卡切换到第三个选项卡,并将一些数据从第一个视图控制器传递到第三个视图控制器。我不能用 segue 来做,因为 segue 在选定的选项卡中创建导航。那不是我的要求。我想在 tabBar 中切换选项卡并在没有任何导航的情况下传递一些数据。我该怎么做?
您可以使用此代码:Objective C
[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
}
}
好的,我尝试在第一个选项卡的 viewController 中创建一个单例对象,然后从第三个选项卡栏的 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 -
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() 方法,它将起作用。谢谢
Swift 3 in latest Xcode version 8.3.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"]
}
}