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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

в .h

 otherclassref *otherclassname @property (assign) otherclassname otherclassref; 

и в .m

 @synthesize otherclassref; 

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

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

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

  • как увеличить размер шрифта в UIWebView
  • Как я могу перебирать все подпункты UIView, а также их подзоны и их подпрограммы
  • Какова максимальная длина объекта NSString?
  • Выполнение команд оболочки с помощью NSTask - Objective-C Cocoa
  • Зачем использовать протокол NSObject для реализации протокола
  • Как вы вычисляете день года на определенную дату в Objective-C?
  • applicationWillEnterForeground против applicationDidBecomeActive, applicationWillResignActive vs. applicationDidEnterBackground
  • Загрузка изображений из фоновой темы с использованием блоков
  • Очереди отправки: как узнать, запущены ли они и как их остановить
  • Ширина пикселя текста в UILabel
  • Как использовать VideoToolbox для распаковки видеоstreamа H.264
  • Interesting Posts

    Как добавить веб-API в существующий проект ASP.NET MVC 4 Web Application?

    Заставить Chrome игнорировать «слабый эфемерный открытый ключ Диффи-Хеллмана»

    Как изменить цвет строки состояния для соответствия приложению в Lollipop?

    Настройка скрипта jQuery Mobile

    Определение типа двоичного / текстового файла в Java?

    Необходима программа для проверки целостности видеофайлов

    Как сделать дерево в Twig

    Как утверждать, что Iterable содержит элементы с определенным свойством?

    Android Открыть и сохранить файлы в / из Google Диска SDK

    Что такое ленивая загрузка в Hibernate?

    Пакетное преобразование .doc в .docx (и эквивалентное для других офисных форматов)?

    Перемещение текста в режиме вставки

    Получение отдельного windows приложения текущего уровня громкости, как визуализируется в аудио Mixer

    Предотвратите установку установщиком Windows 10 с помощью предустановленного серийного ключа без отключения UEFI

    Что означает ошибка компиляции «Не могу найти символ»?

    Давайте будем гением компьютера.