iPhone viewWillAppear не стреляет - PullRequest
       82

iPhone viewWillAppear не стреляет

114 голосов
/ 25 сентября 2008

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

Если я создам RootViewController и вызову addSubView на этом контроллере, я ожидаю, что добавленные представления будут подключены к событиям viewWillAppear.

Есть ли у кого-нибудь пример сложной программной иерархии представлений, которая успешно получает viewWillAppear событий на каждом уровне?

Состояние документов Apple:

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

Проблема в том, что они не описывают, как это сделать. Что значит «напрямую»? Как вы «косвенно» добавляете представление?

Я довольно новичок в Какао и iPhone, поэтому было бы неплохо, если бы были полезные примеры от Apple, кроме основного хрена Hello World.

Ответы [ 24 ]

0 голосов
/ 29 января 2019

В моем случае это была просто странная ошибка в эмуляторе ios 12.1. Исчез после запуска на реальном устройстве.

0 голосов
/ 23 октября 2018

В моем случае проблема была с пользовательской анимацией перехода. Когда установлено modalPresentationStyle = .custom viewWillAppear не вызывается

в пользовательском классе анимации перехода необходимо вызвать методы: beginAppearanceTransition и endAppearanceTransition

0 голосов
/ 17 сентября 2011

Вы должны иметь только 1 активный UIViewController в любое время. Любые подпредставления, которыми вы хотите манипулировать, должны быть именно такими - subVIEWS - т.е. UIView.

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

  • один UIViewController должен использоваться для управления "стоимостью экрана" вашего приложения
  • используйте UINavigationController для смены видов

Что я подразумеваю под "достоинством экрана"? Это немного расплывчато, но обычно это функция или раздел вашего приложения. Если у вас есть несколько экранов с одним и тем же фоновым изображением, но с разными оверлеями / всплывающими окнами и т. Д., Это должен быть 1 контроллер представления и несколько дочерних представлений. Вы никогда не должны работать с двумя контроллерами представления. Обратите внимание, что вы все еще можете создать экземпляр UIView в одном контроллере представления и добавить его в качестве подпредставления другого контроллера представления, если вы хотите, чтобы определенные области экрана отображались в нескольких контроллерах представления.

Что касается UINavigationController - это ваш лучший друг! Отключите панель навигации и укажите «Нет» для анимации, и у вас есть отличный способ переключения экранов по требованию. Вы можете выдвигать и выдвигать контроллеры представления, если они находятся в иерархии, или вы можете подготовить массив контроллеров представления (включая массив, содержащий один VC) и установить его в качестве стека представления, используя setViewControllers. Это дает вам полную свободу менять виртуальные каналы, в то же время получая все преимущества работы в рамках ожидаемой модели Apple и обеспечения надлежащего запуска всех событий и т. Д.

Вот что я делаю каждый раз, когда запускаю приложение:

  • запуск из оконного приложения
  • добавить UINavigationController в качестве rootViewController окна
  • добавить все, что я хочу, чтобы мой первый UIViewController был rootViewController для nav Контроллер * * тысяча двадцать-два

(примечание, начинающееся с окон, это просто личное предпочтение - мне нравится создавать вещи самостоятельно, поэтому я точно знаю, как они создаются. Это должно хорошо работать с шаблоном на основе представления)

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

0 голосов
/ 16 ноября 2011

Я не уверен, что это та же проблема, которую я решил.
В некоторых случаях метод не выполняется обычным способом, таким как «[self methodOne]».

Попробуйте

- (void)viewWillAppear:(BOOL)animated
{
    [self performSelector:@selector(methodOne) 
           withObject:nil afterDelay:0];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...