Сбой iPhone при представлении контроллера модального вида - PullRequest
30 голосов
/ 11 сентября 2009

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

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    // Show load
    LoadViewController *loader = [[LoadViewController alloc] init];
    [self presentModalViewController: loader animated:NO];
    [loader release];
}

Но когда я делаю это, я получаю «сигнал программы получен:« EXC_BAD_ACCESS ».» ошибка.

Трассировка стека:

0  0x30b43234 in -[UIWindowController transitionViewDidComplete:fromView:toView:]
1  0x3095828e in -[UITransitionView notifyDidCompleteTransition:]
2  0x3091af0d in -[UIViewAnimationState sendDelegateAnimationDidStop:finished:]
3  0x3091ad7c in -[UIViewAnimationState animationDidStop:finished:]
4  0x0051e331 in run_animation_callbacks
5  0x0051e109 in CA::timer_callback
6  0x302454a0 in CFRunLoopRunSpecific
7  0x30244628 in CFRunLoopRunInMode
8  0x32044c31 in GSEventRunModal
9  0x32044cf6 in GSEventRun
10 0x309021ee in UIApplicationMain
11 0x00002154 in main at main.m:14

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

Спасибо

Mike

Редактировать: Очень странно ... Я немного изменил его, чтобы представление загрузки отображалось после небольшой задержки, и это прекрасно работает! Так что, похоже, что-то внутри одного и того же цикла событий!

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    // Show load
    [self performSelector:@selector(doit) withObject:nil afterDelay:0.1];
}

- (void)doit {
    [self presentModalViewController:loader animated:YES];  
}

Ответы [ 16 ]

30 голосов
/ 16 сентября 2009

Я немного изменил его, чтобы после небольшой задержки отображался вид загрузки, и это прекрасно работает! Так что, похоже, что-то в том же цикле событий!

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    // Show load
    [self performSelector:@selector(doit) withObject:nil afterDelay:0.1];
}

- (void)doit {
    [self presentModalViewController:loader animated:YES];  
}
5 голосов
/ 28 июня 2010

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

После прочтения сообщений в этой теме я попытался создать простой воспроизводимый пример, используя шаблон приложения панели вкладок. Я смог использовать UIImagePickerController, чтобы показать первый модальный вид после ответа на нажатие кнопки в «FirstViewController.m». Когда я снова попытался показать UIImagePickerController (после обработки сообщения imagePickerControllerDidCancel), приложение завершилось с той же ошибкой.

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

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Attempting to begin a modal transition from to while a transition is already in progress. Wait for viewDidAppear/viewDidDisappear to know the current transition has completed'

Так что, похоже, мой единственный выбор - следовать совету сообщения об ошибке и просто подождать, пока viewDidAppear (используя флаг, чтобы указать, что я нахожусь в этом специальном режиме), а затем загрузить второе модальное представление.

Вот полная трассировка стека для полноты:

** Call stack at first throw:
(
 0   CoreFoundation                      0x0238c919 __exceptionPreprocess + 185
 1   libobjc.A.dylib                     0x024da5de objc_exception_throw + 47
 2   CoreFoundation                      0x02345078 +[NSException raise:format:arguments:] + 136
 3   Foundation                          0x000ab8cf -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 116
 4   UIKit                               0x00544317 -[UIWindowController transition:fromViewController:toViewController:target:didEndSelector:] + 212
 5   UIKit                               0x0035c769 -[UIViewController presentModalViewController:withTransition:] + 2937
 6   TestTempDelete                      0x000021cf -[FirstViewController showImagePicker] + 167
 7   Foundation                          0x0002fcea __NSFireDelayedPerform + 441
 8   CoreFoundation                      0x0236dd43 __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 19
 9   CoreFoundation                      0x0236f384 __CFRunLoopDoTimer + 1364
 10  CoreFoundation                      0x022cbd09 __CFRunLoopRun + 1817
 11  CoreFoundation                      0x022cb280 CFRunLoopRunSpecific + 208
 12  CoreFoundation                      0x022cb1a1 CFRunLoopRunInMode + 97
 13  GraphicsServices                    0x02bf12c8 GSEventRunModal + 217
 14  GraphicsServices                    0x02bf138d GSEventRun + 115
 15  UIKit                               0x002beb58 UIApplicationMain + 1160
 16  TestTempDelete                      0x00001eb4 main + 102
 17  TestTempDelete                      0x00001e45 start + 53

Надеюсь, это поможет.

4 голосов
/ 25 июля 2011

** Как было сказано ранее, используйте isIgnoringInteractionEvents

//Check if the app is ignoring interatctions, if so, add a delay for 1 sec
if([[UIApplication sharedApplication] isIgnoringInteractionEvents]==TRUE) {
        [currentViewController performSelector:@selector(presentModalViewController:animated:) withObject:screen afterDelay:1];
    } else {
        [currentViewController presentModalViewController:screen animated:YES];
    }
3 голосов
/ 25 мая 2011

Я столкнулся с тем же исключением

Завершение приложения из-за необработанного исключения «NSInternalInconsistencyException», причина: «Попытка начать модальный переход с на, когда переход уже выполняется. Подождите, пока viewDidAppear / viewDidDisappear узнает, что текущий переход завершен '

Как предлагалось ранее, я пытался отложить представление модального перехода, но это не очень помогло. Затем я обнаружил, что к событию TouchUpInside моей кнопки подключено несколько IBActions !!! . В моем случае началось бы два IBActions: модальная сборка людей и модальная сборка изображений. Это объясняет сообщение об ошибке. Проверьте, подключено ли у вас несколько IBActions!

3 голосов
/ 09 февраля 2011

Возможно, если вы получили это после нажатия кнопки, которая была связана с вашим кодом в Интерфейсном Разработчике, что у вас есть два действия, связанные с одной кнопкой (возможно, если у вас был модальный вид, связанный с кнопкой, тогда продублировал кнопку и связал другой модальный вид). Это попытается уволить их обоих, и поэтому не получится с этим сообщением.

1 голос
/ 21 августа 2011

У меня была такая же проблема из-за несоответствия между именами в

HelpViewController *controller = [[HelpViewController alloc] initWithNibName:@"HelpView" bundle:nil];

и имя самого файла .xib.

1 голос
/ 14 января 2011

У меня была похожая ошибка при нажатии на UIButton, чтобы открыть Modal View. Я изменил UIButton's слушатель с UIControlEventAllEvents на UIControlEventTouchUpInside. По сути, он запускал модальное представление на Touch Down Inside, а затем снова на Touch Up Inside.

1 голос
/ 26 февраля 2010

Я думаю, что эта проблема как-то связана с проблемой, с которой я тоже столкнулся. Это очень легко воспроизвести:

Создание нового проекта XCode "Utility Application". В FlipsideViewController.m Вы просто вставляете следующий метод:

- (void)viewDidAppear:(BOOL)animated {
  [super viewDidAppear: animated];
  [self showInfo];
}

Если вы сделаете это, запустите приложение, тогда обратный просмотр будет активирован прямо далеко. Как только вы нажмете кнопку «Готово» на обратной стороне, вы вернетесь в Mainview, который снова запускает viewDidAppear и возвращается обратно к Посмотреть. Как только отображается обратный просмотр, приложение останавливается - нет памяти Вызывается коллокатор - все равно, что вы нажали кнопку возврата.

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

Я действительно понятия не имею, что это за проблема ...

С наилучшими пожеланиями, Tobias

1 голос
/ 11 сентября 2009

Скорее всего, ваша проблема в методе, который инициирует и представляет метод, в котором находится viewDidAppear, или в методе init / viewDidLoad / viewWillAppear LoadViewController.

Установите несколько точек останова и следуйте до сбоя ...

0 голосов
/ 27 марта 2015

Я думаю, что причина цикла в том, что новый загружаемый контроллер представления по умолчанию имеет метод viewDidAppear и имеет

[super viewDidAppear animated];

, что означает, что он снова будет вызывать viewDidAppear контроллера основного представления, как если бы он продолжал цикл

в Viewcontroller, который вы представляете, есть такой метод, без супер viewdidapper:

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

}
...