iPhone: как передавать данные между несколькими контроллерами представления в приложении с вкладками - PullRequest
20 голосов
/ 02 марта 2010

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

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

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

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

Ответы [ 3 ]

28 голосов
/ 02 марта 2010

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

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

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

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

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

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

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

Edit:

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

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

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

4 голосов
/ 02 марта 2010

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

0 голосов
/ 02 марта 2010

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

в .ч

otherclassref *otherclassname

@property (assign) otherclassname otherclassref;

и в .м

@synthesize otherclassref;

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...