Изменение проблемы VC в Swift. Как передать данные между представлениями в контроллере панели вкладок?

У меня четыре ViewController, я не использую UITabbedbar, потому что его сложнее настроить. Я использую модальный segue, но я думаю, что потребление памяти чрезмерно. это скриншот моего первого и второго ВК. Что я должен использовать, чтобы правильно изменить вид?


Вот код, который я использую:

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


    }
}

1 ответ

Решение

Из диаграммы раскадровки видно, что вы создали переход от каждой кнопки в "панели вкладок" к другому контроллеру представления. За исключением сегмента раскрутки сегменты всегда создают новый экземпляр контроллера представления, на который они переключаются. Таким образом, если вы используете свою настройку для переключения с контроллера просмотра 1 на контроллер просмотра 2, а затем обратно на контроллер просмотра 1, вы не вернетесь к контроллеру просмотра, с которого пришли, а вместо этого создадите совершенно новый контроллер просмотра 1.

Вот почему ваше потребление памяти чрезмерно. Вы продолжаете создавать контроллеры представления, пока ваше приложение не падает.

Я бы порекомендовал вам вернуться к использованию контроллера панели вкладок. Они были разработаны, чтобы выделить контроллеры представления один раз вперед, а затем просто переключаться между ними. Кроме того, у них стандартный вид по причине, это помогает пользователю вашего приложения сразу же узнать, как с ними взаимодействовать.


Для передачи данных между вкладками вы не будете использовать segues, потому что при переключении вкладок переход не происходит. Есть много способов сделать это, но все они сводятся к хранению данных модели, где все вкладки могут получить к ним доступ. Это можно сделать с помощью CoreData в более крупном приложении. Для простого приложения вы можете сделать следующее:

  1. Создайте собственный подкласс UITabBarController, Давайте назовем это CustomTabBarController, Пусть этот класс создаст и сохранит данные модели, к которым будут обращаться все ваши вкладки.

    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. В вашем раскадровке в Инспекторе идентичности измените класс UITabBarController в CustomTabBarController,

  3. В viewWillAppear в каждой из ваших вкладок получите ссылку на данные модели, а затем вы сможете ее использовать.

    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)"
        }
    }
    
Другие вопросы по тегам