передача данных с одного контроллера вкладок на другой в swift
мое приложение имеет три viewController, связанные с тремя вкладками таббара. Я хочу переключиться с 1-й вкладки на 3-ю вкладку и передать некоторые данные с контроллера 1-го вида на контроллер 3-го вида. Я не могу сделать это с помощью segue, потому что segue создает навигацию в выбранной вкладке. Это не мое требование. Я хочу переключить вкладку в tabBar и передать некоторые данные без какой-либо навигации. Как я могу это сделать ?
3 ответов
вы можете использовать этот код : С
[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
}
}
Swift 3 в последней версии Xcode 8.3.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"]
}
}
хорошо, я попытался создать одноэлементный объект в viewController первой вкладки, а затем получить значение этого объекта из viewController третьей вкладки. Он работает только один раз, когда контроллер вида третьей вкладки создает экземпляр в 1-й раз. Я никогда не получал значение этого одноэлементного объекта в контроллере представления третьей вкладки, кроме первого раза. Что мне теперь делать ? В моем коде - в контроллере первой вкладки, если я нажму кнопку, вкладка будет переключена на третью вкладку. Ниже мой фрагмент кода -
в контроллере первой вкладки -
@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 () в контроллере третьей вкладки (вкладка назначения), и он будет работать. Спасибо.