ios swift uiviewcontroller uitabbarcontroller modalviewcontroller

ios - Cambio de problema de VC en Swift. ¿Cómo pasar datos entre vistas en el controlador de la barra de pestañas?



presentviewcontroller swift 4 (1)

Tengo cuatro ViewController, no uso una UITabbedbar porque es más difícil de personalizar. Uso modal segue pero creo que el consumo de memoria es excesivo. Esta es una captura de pantalla de mi primer y segundo VC. ¿Qué tengo que usar para cambiar la vista correctamente?

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 diagrama de Storyboard, está claro que ha creado una secuencia de cada botón en su "barra de pestañas" a otro controlador de vista. Excepto por el modo de desenrollar , los segmentos siempre crean una nueva instancia del controlador de vista al que están cambiando. Entonces, si usa su configuración para cambiar del controlador de vista 1 al controlador de vista 2 y luego de regreso para ver el controlador 1, no volverá al controlador de vista del que vino, sino que creará un controlador de vista 1 completamente nuevo.

Es por eso que su consumo de memoria es excesivo. Sigue creando controladores de vista hasta que su aplicación se bloquee.

Le recomendaría que vuelva a usar un controlador de barra de pestañas. 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 pestañas, no usará segues porque no hay segue cuando se cambian las pestañas. Puede hacer esto de muchas maneras, pero todas se reducen a tener datos del modelo almacenados donde todas las pestañas 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 pestañas.

    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 .

  3. En viewWillAppear en cada una de sus pestañas, obtenga una referencia a los datos del modelo y luego puede usarla.

    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)" } }