Изменение проблемы 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 в более крупном приложении. Для простого приложения вы можете сделать следующее:
Создайте собственный подкласс
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. } }
В вашем раскадровке в Инспекторе идентичности измените класс
UITabBarController
вCustomTabBarController
,В
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)" } }