Как отклонить модальное представление, как только оно отображается (без взаимодействия с пользователем) - PullRequest
1 голос
/ 18 февраля 2010

Я прошу прощения, если мой вопрос может оказаться тривиальным или неясным.Я использую представление, представленное модально.Чтобы добиться небольшого «сценографического» анимационного эффекта, основанного на значении параметра, я хочу достичь следующего поведения:

Если значение равно 0, представленное представление модально остается на дисплее и допускает действия пользователядо тех пор, пока не будет нажата кнопка «назад» (в этом случае представление отклоняется)

если значение равно 1, представление представляется модально, затем оно немедленно закрывается и представление предупреждения появляется над вызывающим представлением.

Теперь я попытался поместить элемент управления на значение в методе viewDidAppear, внутри контроллера модального представления, как это

- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:YES];
if (<value> == 1) {
[self dismissModalViewControllerAnimated:YES];
                  }
}

И что я получил: если значение равно 0, модальное представление остаетсявключено, как запланировано

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

-[UIWindowController transitionViewDidComplete: fromView:toView]

А теперь вопрос (-ы): пытаюсь ли я сделать что-то серьезно незаконное / невозможное?

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

Или решения намного сложнее?

Спасибо

1 Ответ

3 голосов
/ 18 февраля 2010

Может быть, UIWindowController ошибочно полагает, что представление все еще видно, когда возвращается вызов уведомления viewDidAppear.

Попробуйте использовать executeSelector: withObject: afterDelay: с нулевой задержкой - он вызовет выбранный метод как можно скорее после того, как управление вернется в цикл выполнения (и из стека вызовов UIWindowController):

- (void) delayedDismissOfModalViewController {
    [self dismissModalViewControllerAnimated:YES];
}

- (void) viewDidAppear: (BOOL) animated {
   [super viewDidAppear:YES];

   if (<value> == 1) {
      [self performSelector: @selector(delayedDismissOfModalViewController)
                 withObject: nil
                 afterDelay: 0];
   }
}
...