Сбой iPhone при представлении контроллера модального вида

Изучить раздел: Отменить публичные коммиты с возвратом в блог Atlassian https://www.atlassian.com/git/tutorials/resetting-checking-out-and-reverting

30
задан Michael Waterfall 11 September 2009 в 18:16
поделиться

10 ответов

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

- (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];  
}
30
ответ дан 28 November 2019 в 00:02
поделиться

EXC_BAD_ACCESS - ошибка памяти. Вероятно, вы пытаетесь использовать объект, который уже был освобожден / освобожден. Этот ответ дает несколько советов по устранению этих проблем:

Отладка EXC_BAD_ACCESS

-2
ответ дан 28 November 2019 в 00:02
поделиться

Это действительно зависит от того, что делают процедуры поддержки для viewDidAppear . Например, если presentModalViewController: animated: не сохраняет загрузчик , сбой может быть вызван тем, что UIWindowController пытается говорить о загрузчике , который с тех пор был выпущен (в конце процедуры, которую вы опубликовали).

0
ответ дан 28 November 2019 в 00:02
поделиться

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

Установите несколько точек останова и выполните до аварии ...

1
ответ дан 28 November 2019 в 00:02
поделиться

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

Создайте новый проект XCode «Служебное приложение». В FlipsideViewController.m вы просто вставляете следующий метод:

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

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

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

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

С уважением, Тобиас

1
ответ дан 28 November 2019 в 00:02
поделиться

У меня была аналогичная проблема при использовании той же техники, что и вы, для реализации представления загрузки. Он вылетал, когда представление загрузки было закрыто в конце загрузки. В моем случае проблема возникла из-за того, что как только представление загрузки было закрыто, viewDidAppear был вызван снова и попытался представить загрузку еще раз, что предположительно вызвало сбой. Я исправил это, просто проверив, было ли ранее представлено представление загрузки:

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

    if(needDisplayLoader)
        [self presentModalViewController: loader animated:NO];
}

Затем я установил для needDisplayLoader значение NO перед тем, как закрыть представление загрузчика

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

0
ответ дан 28 November 2019 в 00:02
поделиться

Я столкнулся с этой проблемой только сейчас и исправил ее с помощью предложенного выше selector: afterDelay. Чтобы добавить, я скомпилировал (без исправления) под бета-версию iPhone OS 4.0, и НЕТ АВАРИИ! Итак, ошибка в XCode, похоже, была исправлена ​​в следующем поколении. Не то чтобы это принесло пользу кому-либо из нас сегодня, но, чтобы вы все знали, это действительно было ошибкой в ​​Xcode, и не обязательно что-то, что мы делали неправильно в наших стилях кодирования.

0
ответ дан 28 November 2019 в 00:02
поделиться

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

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

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

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

Похоже, что мой единственный выбор - последовать совету сообщения об ошибке и просто дождаться 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

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

5
ответ дан 28 November 2019 в 00:02
поделиться

Была точно такая же проблема. Решил это с помощью предложенного выше ...

[самостоятельно выполнитьSelector: @selector (doit) withObject: nil afterDelay: 0.5];

Пришлось использовать задержку 0,5 секунды. Возможно, потому что я выполнял presentModalViewController сразу после модального UIPickerViewController.

0
ответ дан 28 November 2019 в 00:02
поделиться

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

0
ответ дан 28 November 2019 в 00:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: