У меня есть следующая проблема:
Я создал приложение панели вкладок с 4 вкладками. Я хочу передать объект/переменную от первого контроллера вкладки до третьего и инициализировать этот контроллер с соответствующим объектом.
Я уже провел некоторое исследование. Лучший способ, соответствуя чистому образцовому подходу, состоял бы в том, чтобы назвать некоторый initWithObject: метод на названном viewcontroller. Как я могу достигнуть этого? Как я могу звонить init
метод receivercontroller в callercontroller? Можно ли дать мне некоторый пример кода?
Править: Для передачи данных между несколькими представлениями/классами и т.д. просто создают некоторый класс данных, который содержит данные, совместно используемые несколькими классами. Для получения дополнительной информации перейдите по ссылке: Singleton
Вам нужен объект модели данных, который хранит данные для приложения.
Модель данных - это настраиваемый, отдельный объект, доступный из любой точки приложения. Объект модели данных ничего не знает ни о представлениях, ни о контроллерах представления. Он просто хранит данные и логические связи между этими данными.
Когда различным частям приложения нужно записать или прочитать данные, они записывают и читают их в модели данных. В вашем случае view1 сохраняет свои данные в модели данных при выгрузке, а view2 считывает их из модели данных при загрузке (или наоборот)
В правильно спроектированном приложении никакие два контроллера представления не должны иметь доступ к внутренним данным другого контроллера. (Единственная причина, по которой контроллеры представления должны знать о существовании другого контроллера, это если он должен вызвать загрузку этого другого контроллера).
Быстрый и грязный способ создания модели данных - добавить атрибуты к делегату приложения и затем вызвать делегат приложения из контроллеров представления, используя:
YourAppDelegateClass *appDelegate = [[UIApplication sharedApplication] delegate];
myLocalProperty = appDelegate.someDataModelProperty;
Это подойдет для небольшого проекта, но когда ваши данные станут сложными, вам следует создать специальный класс для модели данных.
Редактировать:
Чтобы уточнить для вашего конкретного случая, вы должны добавить вызов к модели данных, когда приемник viewController становится активным.
Размещение данных в методе init или viewDidLoad
не будет работать, потому что в UITabBar
пользователи могут переключаться туда и обратно без выгрузки представления или повторной инициализации контроллера представления.
Лучшее место для получения изменяющихся данных - метод контроллера viewWillAppear
. Таким образом, данные будут обновляться каждый раз, когда пользователь переключается на эту вкладку.
Возможно, вы захотите рассмотреть NSNotificationCenter
(Reference); вы регистрируете один viewcontroller в центре уведомлений приложения и отправляете уведомление, когда делается выбор. Когда уведомление получено, другой вьюконтроллер обновляет себя соответствующим образом.
Я не думаю, что это лучшая практика (также проверьте синтаксис), однако мне сошло с рук:
в в .h
otherclassref *otherclassname
@property (assign) otherclassname otherclassref;
и в .m
@synthesize otherclassref;
тогда я просто назначаю ссылку из удобного места, например делегат приложения или где бы вы ни создавали свои контроллеры просмотра.
тогда контроллер представления может получить ссылку на другой контроллер представления.
Я добавляю @class secondviewcontroller в файл .h для firstviewcontroller и помещаю #imports "secondviewcontroller.h" в файл .m первого контроллера представления. Они называются прямыми ссылками и предотвращают ошибки компилятора, возникающие из-за того, что файлы .h ссылаются друг на друга.