viewDidAppear вызывается дважды в iOS5 - PullRequest
6 голосов
/ 27 декабря 2011

Я занимаюсь разработкой приложения с UINavigatorController.Я использую метод viewDidAppear во втором нажатом viewController, чтобы найти информацию на внешнем сервере.

Хорошо.Хотя в начале iOS5 работала нормально, я понял, что viewDidAppear не вызывается в iOS4.3, поэтому я поместил этот код в корень:

- (void)navigationController:(UINavigationController *)navigationController 
       didShowViewController:(UIViewController *)viewController animated:(BOOL)animated 
{
    [viewController viewDidAppear:animated];
}

После этого приложение начало нормально работать в iOS4.3.Тем не менее, в iOS5 нет, потому что он вызывает дважды viewDidAppear (тот, который вызывался сначала, и тот, из navigationController:didShowViewController:animated:)

Что я должен сделать, чтобы вызвать только один раз viewDidAppear?

Большое спасибо

Ответы [ 5 ]

4 голосов
/ 13 января 2012

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

-(void)viewWillAppear:(BOOL)animated {
    if (!viewWillAppearCalled) {
        viewWillAppearCalled = YES;

        /* do stuff */
    }
}

Тогда вы можете смело вызывать его вручную для совместимости с iOS 4.x.

То же самое можно сделать для viewDidAppear, viewWillDisappear и viewDidDisappear.

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

Возможно, у вас есть другая проблема (почему viewDidAppear не вызывается на iOS 4).

Однако я столкнулся с несоответствием между iOS 5 и iOS 4 в этом отношении, потому что я использовал пользовательскийКонтроллер контейнера (ни UINavigationController, ни UITabBarController).Исправление для восстановления совместимости с iOS 4 заключалось в реализации следующего метода в контроллере представления контейнера:

- (BOOL)automaticallyForwardAppearanceAndRotationMethodsToChildViewControllers {
    return NO;
}
1 голос
/ 27 декабря 2011

Проверьте, какую версию iOS использует пользователь, используя [[UIDevice currentDevice] systemVersion]; и в случае, если это 4.3, вызовите метод viewDidAppear.

0 голосов
/ 28 декабря 2011

Если он вызывается дважды, и вы смогли сделать вызов только при добавлении кода в корневую навигацию, почему бы не удалить код из viewDidAppear (первого, который вы создали, который работал на iOS5) и оставить толькотот, который работал в 4.3 и 5?

0 голосов
/ 27 декабря 2011

Вы не должны звонить viewDidAppear: вручную, оставьте до UIKit, чтобы звонить вам.Если вы удалите ручной вызов, он должен быть вызван только один раз.

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