Понимание контроллеров представления

У меня есть приложение TabBar с 4 вкладками. Все четыре вкладки имеют контроллеры навигации. Во вкладке настроек у меня есть таблица с ячейкой "Отзывы". При щелчке по ячейке выдвигается контроллер FeedBackView, который содержит форму обратной связи с несколькими полями. Здесь есть текстовое поле для категории. При прикосновении к текстовому полю контроллер модального представления (FeedBackModalView) представляет собой средство выбора. В методе viewDidLoad контроллера FeedBackModalView я набрал NSLog(@"%@", self.parentViewController).. В консоли он показывает parentViewController как контроллер TabBar. Это почему? Разве он не должен отображать контроллер FeedBackView как parentView, поскольку я представляю модальное представление в этом контроллере?

Надеюсь, я был понятен.


person HG's    schedule 09.03.2011    source источник
comment
К какому объекту вы надеетесь получить доступ? Возможно, кто-то может указать вам на переменную, которая обращается к ней.   -  person Drew C    schedule 09.03.2011
comment
Я хочу получить доступ к контроллеру FeedBackView из модального представления. У него есть метод, который установит текстовое поле категории после того, как категория будет выбрана в средстве выбора. В простых приложениях, основанных на представлениях, я использую [self.parentViewController setCategoryText] (setCategoryText определен в FeedBackController). Но в этом parentViewController — это tabBarController.   -  person HG's    schedule 09.03.2011


Ответы (1)


Использование presentModalViewController с UITabBarController имеет некоторые проблемы, и я считаю, что внутреннее поведение метода постоянно менялось в последних версиях SDK. Суть в том, что вы должны использовать корневой контроллер представления для модального представления контроллера представления. Если вы используете интерфейс панели вкладок, он становится объектом UITabBarController.

В старой версии SDK, когда я представлял модальное представление в контроллере представления внутри контроллера панели вкладок, модальное представление не появлялось в полноэкранном режиме, что не было ожидаемым или задокументированным поведением. Теперь модальное представление, кажется, появляется в полноэкранном режиме в любом месте, и я не удивлюсь, если метод [self presentModalViewController:animated:] внутренне проверяет self, и если он имеет ненулевое свойство parentViewController, отправляет сообщение родительскому контроллеру представления (что объяснит ваше наблюдение) .

Память у меня смутная, и, возможно, кто-то должен меня поправить. Тем не менее, я по-прежнему считаю, что это просто понять (а также, возможно, на практике), presentModal... работает только с корневым контроллером представления.

person MHC    schedule 09.03.2011
comment
Хорошо спасибо. Мне было интересно, есть ли способ получить rootViewController из любого представления? - person HG's; 09.03.2011
comment
Нет «встроенного» метода для получения контроллера представления, поэтому вам необходимо самостоятельно установить связь между корневым vc и другими представлениями. Эти представления, вероятно, сохраняются представлением корневого vc, которое, конечно же, сохраняется корневым vc. Поэтому не создавайте цикл сохранения, сохраняя корневой vc в некоторых объектах представления. Вы можете присвоить (но не сохранить) корневой vc свойству представления, что в основном означает, что корневой vc становится делегатом объекта представления. В этом случае делегирование является хорошей практикой, но вы также можете использовать вместо этого уведомления или KVO, если это соответствует вашим потребностям. - person MHC; 12.03.2011