передача данных с одного контроллера вкладок на другой в 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 () в контроллере третьей вкладки (вкладка назначения), и он будет работать. Спасибо.