Сбой 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 ]

0 голосов
/ 08 июля 2010

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

0 голосов
/ 03 июля 2010

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

[self performSelector:@selector(doit) withObject:nil afterDelay:0.5];

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

0 голосов
/ 20 апреля 2010

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

0 голосов
/ 09 апреля 2010

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

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

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

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

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

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

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

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

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

Отладка EXC_BAD_ACCESS

...