Подтвердить что ты не робот

IPhone: как передавать данные между несколькими Viewcontrollers в приложении Tabbar

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

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

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

Edit:

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

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

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

Ответ 2

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

Ответ 3

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

в .h

otherclassref *otherclassname

@property (assign) otherclassname otherclassref;

и в .m

@synthesize otherclassref;

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

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

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