iPhone: Как Передать Данные Между Несколькими Viewcontrollers в Приложении Панели вкладок

У меня есть следующая проблема:

Я создал приложение панели вкладок с 4 вкладками. Я хочу передать объект/переменную от первого контроллера вкладки до третьего и инициализировать этот контроллер с соответствующим объектом.

Я уже провел некоторое исследование. Лучший способ, соответствуя чистому образцовому подходу, состоял бы в том, чтобы назвать некоторый initWithObject: метод на названном viewcontroller. Как я могу достигнуть этого? Как я могу звонить init метод receivercontroller в callercontroller? Можно ли дать мне некоторый пример кода?

Править: Для передачи данных между несколькими представлениями/классами и т.д. просто создают некоторый класс данных, который содержит данные, совместно используемые несколькими классами. Для получения дополнительной информации перейдите по ссылке: Singleton

20
задан Taryn 19 July 2013 в 15:29
поделиться

3 ответа

Вам нужен объект модели данных, который хранит данные для приложения.

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

Когда различным частям приложения нужно записать или прочитать данные, они записывают и читают их в модели данных. В вашем случае view1 сохраняет свои данные в модели данных при выгрузке, а view2 считывает их из модели данных при загрузке (или наоборот)

В правильно спроектированном приложении никакие два контроллера представления не должны иметь доступ к внутренним данным другого контроллера. (Единственная причина, по которой контроллеры представления должны знать о существовании другого контроллера, это если он должен вызвать загрузку этого другого контроллера).

Быстрый и грязный способ создания модели данных - добавить атрибуты к делегату приложения и затем вызвать делегат приложения из контроллеров представления, используя:

YourAppDelegateClass *appDelegate = [[UIApplication sharedApplication] delegate];
myLocalProperty = appDelegate.someDataModelProperty;

Это подойдет для небольшого проекта, но когда ваши данные станут сложными, вам следует создать специальный класс для модели данных.

Редактировать:

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

Размещение данных в методе init или viewDidLoad не будет работать, потому что в UITabBar пользователи могут переключаться туда и обратно без выгрузки представления или повторной инициализации контроллера представления.

Лучшее место для получения изменяющихся данных - метод контроллера viewWillAppear. Таким образом, данные будут обновляться каждый раз, когда пользователь переключается на эту вкладку.

28
ответ дан 30 November 2019 в 00:27
поделиться

Возможно, вы захотите рассмотреть NSNotificationCenter (Reference); вы регистрируете один viewcontroller в центре уведомлений приложения и отправляете уведомление, когда делается выбор. Когда уведомление получено, другой вьюконтроллер обновляет себя соответствующим образом.

4
ответ дан 30 November 2019 в 00:27
поделиться

Я не думаю, что это лучшая практика (также проверьте синтаксис), однако мне сошло с рук:

в в .h

otherclassref *otherclassname

@property (assign) otherclassname otherclassref;

и в .m

@synthesize otherclassref;

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

тогда контроллер представления может получить ссылку на другой контроллер представления.

Я добавляю @class secondviewcontroller в файл .h для firstviewcontroller и помещаю #imports "secondviewcontroller.h" в файл .m первого контроллера представления. Они называются прямыми ссылками и предотвращают ошибки компилятора, возникающие из-за того, что файлы .h ссылаются друг на друга.

0
ответ дан 30 November 2019 в 00:27
поделиться