UIAlertView + Modal View Controller не работает

У меня есть UIAlertView с кнопками "ОК" и "Отмена". Я хотел бы представить контроллер модального представления при нажатии кнопки OK. Вот что я сделал до сих пор:

  1. Создал поле UIAlertView. Реализован протокол UIAlertViewDelegate. Реализован метод (void)alertView:(UIAlertView *)alert clickedButtonAtIndex:(NSInteger)buttonIndex.
  2. В приведенном выше методе, когда buttonIndex == 0, я пытаюсь сделать что-то с эффектом:

    if (buttonIndex == 0)
    {
        ModalViewController *mdvc = [[[ModalViewController alloc] initWithNibName:nil bundle:nil] autorelease];
        [self presentModalViewController:mdvc animated:YES];
    }
    

Как оказалось, модальное представление не представляет себя. Я пробовал много других подходов, но они только усложняют и заставляют меня создавать много ненужных переменных. ДОЛЖЕН быть более простой способ.

Некоторая дополнительная информация:

  1. Если это имеет какое-либо значение, это приложение OpenGL ES.
  2. Если я вызываю [self presentModalController:] в результате нажатия UIButton, он работает так, как ожидалось — я вижу контроллер модального представления.

person Ravi    schedule 15.09.2011    source источник


Ответы (4)


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

Вместо представления вашего модального окна, когда это вызывается:

- (void)alertView:(UIAlertView *)alert clickedButtonAtIndex:(NSInteger)buttonIndex

Использовать:

- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex

Это сработало для меня как шарм. Из документации:

Этот метод вызывается после окончания анимации и закрытия представления.

person Craig    schedule 28.10.2012

Хорошо ... так что я исправил это сам. Как я уже сказал, это было в приложении OpenGL ES, поэтому я установил несколько глобальных логических значений и вызвал [self presentModalViewController] в методе drawFrame. Я знаю, что это определенно не лучший метод, но в цейтноте, в котором я нахожусь, кажется, нет лучшего решения!

Проблема, безусловно, связана с задержкой, но performSelector:withObject:afterDelay кажется недостаточно!

person Ravi    schedule 16.09.2011

Сначала переместите этот код в новый метод с именем presentModal:.

- (void)presentModal:(UIViewController *)mvc {
    [self presentModalViewController:mvc animated:YES];
}


Затем в методе, где вы обрабатываете ответ от UIAlertView, вызовите этот новый метод, например

ModalViewController *mdvc = [[[ModalViewController alloc] 
                                           initWithNibName:nil 
                                                    bundle:nil] autorelease];
[self performSelector:@selector(presentModal:) 
           withObject:mdvc 
           afterDelay:0.0];


Это отложит выполнение метода presentModal: до тех пор, пока не вернется метод, обрабатывающий UIAlertView, и пока UIAlertView не будет удален с экрана.

person Mike Hay    schedule 15.09.2011
comment
Я уже пробовал этот метод, и он, похоже, не работает. Однако, если я вызываю presentModalController в результате нажатия кнопки UIButton, он работает так, как ожидалось — я вижу контроллер модального представления. - person Ravi; 16.09.2011

Кнопка «Отмена» имеет индекс 0, кнопка «ОК» будет иметь индекс 1. Вы уверены, что выполняете действие с правильным индексом кнопки? (т.е. если вы нажмете «Отмена», он покажет модальное окно?).

person gamozzii    schedule 15.09.2011
comment
да. Это было проверено. Кнопки и индексы отображаются соответствующим образом. - person Ravi; 16.09.2011