ViewWillAppear не вызывается в модальном контроллере. Что здесь не так? - PullRequest
1 голос
/ 11 марта 2011

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

  • window имеет один вид, который обрабатывается по умолчанию UIVieController и содержит кнопку.
  • При нажатии кнопки другой контроллер представления отображается модально ( VC_MAIN ).
  • В зависимости от настроек, модально отображаемый контроллер представления ( VC_MAIN ) будет представлять представление A или представление B.
  • Представления A и B обрабатываются различными контроллерами представления.( VC_A и VC_B ).
  • Ни один из методов ViewWill * или ViewDid * не вызывается в VC_A или VC_B .
  • Я могу обойти это, вызвав их вручную в VC_MAIN в соответствующих методах ViewDid * и ViewWill *.Но если VC_MAIN решит переключиться с VC_A на VC_B , это не поможет. VC_MAIN View * методы больше не будут вызываться и не будут VC_A или VC_B .

Я, конечно, могу dimiss VC_MAINпри переключении с А на В, но я не хочу.Я хочу анимировать переключение, а не просто открыть другое модальное представление.

Почему, черт возьми, эти методы не вызывают?Это действительно за мной!Если вы посмотрите на UISplitViewController: он содержит два подчиненных контроллера, которые могут отображать другие контроллеры.Они в основном делают то же самое, что я пытаюсь сделать.Разместил ли Apple кодджи по всему коду?

Ответы [ 3 ]

1 голос
/ 11 марта 2011

Мой опыт работы с такой проблемой:
Если у вас есть контроллер представления VC , управляющий основным видом V , и у этого представления есть подпредставление V ' управляется другим контроллером представления VC ', viewWillAppear: и другие методы, такие как willRotateToInterfaceOrientation:, не отправляются на VC' .

То, что вы можете сделать, этовручную переадресовывать эти вызовы с VC :

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    [mySubViewController viewWillAppear:animated]; // VC'
}

(Примечание: я не знаком с MonoTouch, поэтому я ответил с кодом ObjC)

EDIT

Это напомнило мне, что Руководство по программированию контроллера представления четко заявляет:

Каждый созданный вами объект контроллера представления отвечает за управление всеми представлениямив единой иерархии представлений.[...] Однозначное соответствие между контроллером представления и представлениями в его иерархии представлений является ключевым соображением при проектировании.Не следует использовать несколько пользовательских контроллеров представления для управления различными частями одной и той же иерархии представления.

0 голосов
/ 07 июня 2012

Вы должны действительно вызвать эти методы вручную. Это собственный способ управления и отображения представлений VC, поэтому вы сами можете определить, когда каждый подчиненный контроллер получает вызовы жизненного цикла. В VC_MAIN создайте метод showVC: newVc, который будет вызывать

[newVc viewWillAppear]
[mainView addSubview:newVc.view]
[newVc viewDidAppear]

аналогично, создайте hideVC: который будет вызывать viewWill / DidHide

в вашем VC_Main viewWillAppear, вызовите метод showVC соответствующим образом, основываясь на текущей конфигурации, и каждый раз, когда вы переключаете ваши представления, методы будут вызываться правильно.

Это старый вопрос, который частично обрабатывался на iOS5, но все еще прекрасно работает таким образом и полностью обратно совместим с iOS3.

0 голосов
/ 11 марта 2011

В качестве причины я бы предположил шаг между

В зависимости от настроек модально отображаемый контроллер вида (VC_MAIN) будет представлять вид А или вид Б.

Представления A и B обрабатываются различными контроллерами представления (VC_A и VC_B).

Если вы читаете введение в руководстве по программированию контроллера представления от Apple, они рекомендуют иметь только один контроллер представления на экран, даже если он управляет несколькими представлениями или иерархией подпредставлений. Вероятно, было бы лучше управлять представлениями A и B непосредственно в VC_MAIN, тогда вы получите нужные вам уведомления. Если вы по какой-либо причине предпочитаете использовать отдельные контроллеры представления, вам, возможно, придется уведомить их об этом самостоятельно.

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