Cambiando el problema de VC en Swift. ¿Cómo pasar datos entre vistas en el controlador de la barra de tabs?

Tengo cuatro ViewController, no uso una barra de UITabbed porque es más difícil de personalizar. Utilizo la transición modal pero creo que el consumo de memoria es excesivo. esta es una captura de pantalla de mi primer y segundo VC. ¿Qué debo usar para cambiar la Vista correctamente?

enter image description here


Ese es el código que uso:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) { if (segue.identifier == "second") { let secondVC = segue.destinationViewController as SecondViewController; } } 

Desde su diagtwig Storyboard, está claro que ha creado un paso de cada botón en su “barra de tabs” a otro controlador de vista. Excepto por el segue de desenrollado , los segues siempre crean una nueva instancia del controlador de vista al que están cambiando. Por lo tanto, si utiliza su configuración para cambiar de ver el controlador 1 para ver el controlador 2 y luego volver para ver el controlador 1, no volverá al controlador de vista del que vino, sino que creará un controlador de vista completamente nuevo 1.

Es por eso que su consumo de memoria es excesivo. Usted sigue creando controladores de vista hasta que su aplicación se cuelga.

Te recomendaría que vuelvas a usar un controlador de barra de tabs. Fueron diseñados para asignar los controladores de vista una vez por adelantado y luego simplemente cambiar entre ellos. Además, tienen un aspecto estándar por una razón: ayuda al usuario de su aplicación a saber de inmediato cómo interactuar con ellos.


Para pasar datos entre tabs, no usará segues porque no hay transición cuando cambia de tabs. Hay muchas maneras en que puede hacerlo, pero todas se reducen a tener datos de modelo almacenados donde todas las tabs pueden acceder. Esto se puede hacer con CoreData en una aplicación más grande. Para una aplicación simple, puede hacer lo siguiente:

  1. Cree una subclase personalizada de UITabBarController . Llamémoslo CustomTabBarController . Haga que esa clase cree y mantenga los datos del modelo a los que accederá cada una de sus tabs.

    CustomTabBarController.swift:

     import UIKit // This class holds the data for my model. class ModelData { var name = "Fred" var age = 50 } class CustomTabBarController: UITabBarController { // Instantiate the one copy of the model data that will be accessed // by all of the tabs. var model = ModelData() override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. } } 
  2. En su Storyboard, en el Inspector de identidad, cambie la clase de UITabBarController a CustomTabBarController .

    enter image description here

  3. En viewWillAppear en cada una de sus tabs, obtenga una referencia a los datos del modelo y luego puede usarlo.

    FirstViewController.swift:

     import UIKit class FirstViewController: UIViewController { override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) // Get a reference to the model data from the custom tab bar controller. let model = (self.tabBarController as! CustomTabBarController).model // Show that we can access and update the model data from the first tab. // Let's just increase the age each time this tab appears and assign // a random name. model.age += 1 let names = ["Larry", "Curly", "Moe"] model.name = names[Int(arc4random_uniform(UInt32(names.count)))] } } 

    SecondViewController.swift:

     import UIKit class SecondViewController: UIViewController { @IBOutlet weak var nameLabel: UILabel! @IBOutlet weak var ageLabel: UILabel! override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) // Get a reference to the model data from the custom tab bar controller. let model = (self.tabBarController as! CustomTabBarController).model // This tab will simply access the data and display it when the view // appears. nameLabel.text = model.name ageLabel.text = "\(model.age)" } }