viewWillAppear вызывается дважды в iOS5 - PullRequest
5 голосов
/ 18 октября 2011

Я запускаю все свои приложения, чтобы убедиться, что это не только одно приложение, и в каждом моем приложении при запуске на симуляторе или устройстве iOS5 метод viewWillAppear вызывается дважды при каждом просмотре.У меня есть простой NSLog(@"1");, и он появляется дважды в моей консоли каждый раз.Это только у меня или что-то происходит?(В iOS4 он вызывается только один раз)

Это код, вызывающий представление, которое дважды вызывает viewWillAppear:

     CloseDoorViewController *closeVC;

     if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
            closeVC = [[ CloseDoorViewController alloc] initWithNibName:@"CloseDoorViewIpad" bundle:nil];
        } else {
            closeVC = [[ CloseDoorViewController alloc] initWithNibName:@"CloseDoorViewController" bundle:nil];
        }

        [self.view addSubview:closeVC.view];
        [self presentModalViewController:closeVC animated:NO];

Ответы [ 4 ]

16 голосов
/ 18 октября 2011

Это -addSubview: метод.

При добавлении или удалении представления контроллера представления кто-то должен вызывать методы 'View Event', такие как -viewWillAppear: и т. Д. Контроллера представления.

На самом деле, это не был рекомендуемый способ -addSubview: / - удалить представление контроллера ViewFromSuperView самостоятельно до iOS 5, потому что он не вызывает методы 'View Event' (вы можете / должны вызывать его самостоятельно). Вместо этого было рекомендовано использовать «косвенный» способ сделать это, например -presentModalViewController: вы используете (он вызывает методы «Просмотр событий» от вашего имени).

В iOS 5 Apple изменила поведение методов -addSubview: / - removeFromSuperView, чтобы разрешить непосредственное управление представлением контроллера представления. Так что теперь, когда вы используете эти методы в представлении viewController, методы 'View Event' будут вызываться автоматически.

Так его называли дважды.

Смотрите видеофильм «Реализация ограничения UIViewController» на здесь также.

10 голосов
/ 18 октября 2011

Поскольку вы отображаете представление дважды.

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

[self.view addSubview:closeVC.view];

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

[self presentModalViewController:closeVC animated:NO];

Я не уверен, почему в iOS4 viewWillAppear вызывался только один раз, потому что iOS5 правильно вызывать его дважды, учитывая, что вы отображаете представление дважды, как описано выше.

Просто удалите одну из строк, и все будет хорошо (я бы рекомендовал удалить addSubview и сохранить presentModalViewController).

5 голосов
/ 11 мая 2012

Если вы хотите восстановить старое (iOS 4) поведение в вашем контроллере представления, вы должны реализовать следующий метод:

- (BOOL)automaticallyForwardAppearanceAndRotationMethodsToChildViewControllers {
    return NO;
}
1 голос
/ 18 октября 2011

Обновление: , так как вы отредактировали свой вопрос, включив в него пример кода, ясно, в чем проблема.Ответ Лукмана, приведенный выше, является правильным / превосходным.

Оригинальный ответ до включения кода:

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

(обратите внимание, что если вы еще не переопределили метод -init в этом классе, убедитесь, что вы переопределили указанный инициализатор, который является -[UIViewController initWithNibName:bundle:])

http://developer.apple.com/library/ios/#DOCUMENTATION/UIKit/Reference/UIViewController_Class/Reference/Reference.html

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