Доступ к IBOutlets другого контроллера представления, размещенному в представлении-контейнере

У меня есть Container View, в котором 1 из 3 контроллеров представлений заменены на 3 вкладки (внизу).

Вот моя раскадровка:

введите здесь описание изображения

Я использую этот подход, чтобы иметь настраиваемые вкладки и одну кнопку Сохранить для всех полей в этой большой форме.

Как я могу получить доступ к IBOutlets в этих трех дочерних контроллерах представления из моего класса Entry Detail View Controller?

Вот что я сделал, чтобы попытаться получить к нему доступ в родительском.

//EntryFlightInfoViewController.h (Child 1)
@property (strong, nonatomic) IBOutlet UITextField *aircraftIdTextField;

Затем в моем родительском классе (контроллер представления сведений о входе) я не могу получить доступ к свойству:

//EntryDetailViewController.m (Parent)
#import "PPEntryFlightInfoViewController.h"

- (IBAction)buttonSave:(id)sender {
  NSLog(@"save: %@", _aircraftIdTextField); //(!) Error: Use of undeclared identifier '_aircraftIdTextField'
}

Как мне получить доступ к IBOutlets другого контроллера представления, когда они находятся в представлении-контейнере? Надеюсь, я на правильном пути. Простите меня, поскольку я все еще новичок в Objective-C. :)


person Clifton Labrum    schedule 13.05.2013    source источник
comment
Мне кажется странным, что контролеры знают о работе своих детей. У меня был бы отдельный объект (NSManageObject, NSDictionary и т. д.), который содержит все значения для вашей подробной записи. ; Идентификатор самолета, инструменты, подпись и т. д. Затем, когда вы загружаете контроллеры подвида подробной записи, я передаю этот объект. Контроллеры подпредставления будут затем обновлять значения в этом объекте.   -  person NixonsBack    schedule 14.05.2013


Ответы (4)


Короткий ответ: вы не сможете, если не напишете свой собственный коммуникационный слой. Вы можете получить доступ к различным представлениям через childViewControllers (упомянутые выше), а также получить свои собственные пользовательские указатели в вызове метода prepareForSegue, поскольку представление загружается в представление контейнера. (см. эту ссылку для получения дополнительной информации) Это отлично сработает, если вы заставляете пользователя посещать каждую страницу. Если нет, то те же значения по умолчанию, которые вы загрузили бы там при первом viewDidLoad, вероятно, могут быть сохранены без проверки конкретного контроллера представления.

Ответ Apple — никогда не иметь кнопки сохранения. Если вы отредактируете его, вы имели в виду это, и оно сразу же будет сохранено. знак равно

Тем не менее, если бы я был вами, у меня был бы объект, к которому все представления обращаются для загрузки/выгрузки своих данных для хранения всякий раз, когда вы показываете/скрываете различные представления, возможно, в viewDidLoad/viewDidDisappear. Таким образом, у вас всегда будет «заведомо исправный» объект, готовый к сохранению, и вам не придется напрямую обращаться к этим контроллерам представления.

Надеюсь, это поможет некоторым.

person slycrel    schedule 14.05.2013
comment
После дальнейших исследований я пришел к тому же выводу, что и вы. Мне нужно сохранить поля каждого дочернего представления в NSManagedObjectContext (я использую Magical Record и Core Data). viewDidDisappear я просто сохраню все поля в объекте, а затем сохраню в базу данных, когда пользователь нажмет "Сохранить". Спасибо! - person Clifton Labrum; 14.05.2013
comment
Вы держите пари. Я нашел этот вопрос на странице FB для разработчиков мобильных устройств из Юты, рад, что смог помочь. знак равно - person slycrel; 15.05.2013

Контроллеры представления в представлении контейнера являются дочерними элементами контроллера представления контейнера. Таким образом, вы можете получить доступ к текущему дочернему контроллеру представления с помощью self.childViewControllers[0] и выходу с помощью [self.childViewControllers[0] planeIdTextField].

person rdelmar    schedule 14.05.2013
comment
Я не вижу ничего плохого в таком подходе к контейнерным представлениям. Зачем прыгать через обручи, используемые в некоторых других ответах? - person mbeaty; 06.03.2015

Клифтон, по возможности старайтесь не сообщать венчурным капиталистам о средствах контроля друг друга. Вы можете просто отправить сообщение с помощью кнопки сохранения, а три подчиненных венчурных капиталиста наблюдают за ним. Когда они получают сообщение, они сохраняют свою информацию. Таким образом, главный VC не должен знать об элементах управления внутри своих подчиненных.

person user2379765    schedule 14.05.2013
comment
Я предполагаю, что вы имеете в виду NSNotification. Это правильно? Я никогда не использовал его. Итак, если я подключим это, будет ли каждый контроллер представления сохранять значения в своих собственных полях UITextField, даже если они в настоящее время не загружены в представление контейнера? Вкладки переключают один из трех контроллеров представления. - person Clifton Labrum; 14.05.2013

Вам нужна ссылка на текущий контроллер представления вкладок, затем вы запрашиваете у него выход:

self.entryFlightInfoViewController.aircraftIdTextField

Пытаясь использовать _aircraftIdTextField, вы пытаетесь получить прямой доступ к переменной экземпляра в классе контроллера представления контейнера. Очевидно, что если нет переменной с таким именем, вы получите ошибку компиляции.

person Wain    schedule 13.05.2013