将数据从一个选项卡控制器快速传递到另一个选项卡控制器
Posted
技术标签:
【中文标题】将数据从一个选项卡控制器快速传递到另一个选项卡控制器【英文标题】:passing data from one tab controller to another in swift 【发布时间】:2015-02-11 12:57:14 【问题描述】:我的应用程序有三个 viewController 与 tabBar 的三个选项卡相关联。我想从第一个选项卡切换到第三个选项卡,并将一些数据从第一个视图控制器传递到第三个视图控制器。我不能用 segue 来做,因为 segue 在选定的选项卡中创建导航。那不是我的要求。我想在 tabBar 中切换选项卡并在没有任何导航的情况下传递一些数据。我该怎么做?
【问题讨论】:
这是一个使用单例 Swift 类在控制器之间共享数据的简洁示例:***.com/a/44380145/2162226 如果你不在标签根目录,你可以使用展开转场。 Here is an example. 【参考方案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() 方法,它将起作用。谢谢。
【讨论】:
以上是关于将数据从一个选项卡控制器快速传递到另一个选项卡控制器的主要内容,如果未能解决你的问题,请参考以下文章