iPhone zawiesza się podczas prezentowania kontrolera widoku modalnego

Próbuję wyświetlić widok modalny bezpośrednio po tym, jak inny widok został przedstawiony modalnie(drugi to Widok ładowania, który się pojawia).

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

Ale kiedy to robię, dostaję "Program otrzymał sygnał: "EXC_BAD_ACCESS"."błąd.

Ślad stosu to:

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
Jakieś pomysły? Jestem totalnie zakłopotany! Widok ładowania jest pusty, więc zdecydowanie nie dzieje się tam nic, co powoduje błąd. Czy ma to coś wspólnego z uruchomieniem 2 widoków modalnie w tej samej pętli zdarzeń czy coś?

Dzięki,

Mike

Edit: bardzo dziwne... Zmodyfikowałem go nieco tak, aby Widok ładowania był wyświetlany po niewielkim opóźnieniu i to działa dobrze! Więc wydaje się, że jest to coś w tej samej pętli zdarzeń!

- (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];  
}
Author: Michael Waterfall, 2009-09-11

16 answers

Zmodyfikowałem go nieco tak, aby Widok ładowania był wyświetlany po niewielkim opóźnieniu i to działa dobrze! Więc wydaje się, że jest to coś w tej samej pętli zdarzeń!

- (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
Author: Michael Waterfall,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-16 12:51:55

Wydaje mi się, że powtórzyłem ten sam błąd w iOS 4. W mojej aplikacji awaria występowała konsekwentnie podczas próby pokazania drugiego widoku modalnego natychmiast po pokazaniu pierwszego widoku modalnego. Przez kilka godzin walczyłem z szaleństwem.

Po przeczytaniu postów w tym wątku, próbowałem stworzyć prosty, powtarzalny przykład za pomocą szablonu aplikacji paska kart. Udało mi się użyć interfejsu UIImagePickerController, aby wyświetlić pierwszy widok modalny po odpowiedzi na kliknięcie przycisku w "FirstViewController.m". Kiedy próbowałem ponownie pokazać UIImagePickerController (po obsłudze komunikatu imagePickerControllerDidCancel), aplikacja zawiesiła się z tym samym błędem.

Na urządzeniu po prostu nie było pojęcia, co się dzieje. Jednak, kiedy uruchomiłem kod na symulatorze, miałem szczęście, że dostałem tę wiadomość na konsoli:

*** 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'

Więc wydaje się, że moim jedynym wyborem jest postępować zgodnie z radami Komunikatu o błędzie i po prostu czekać, aż viewDidAppear (używając flagi, aby wskazać, że jestem w tym trybie specjalnym), a następnie załadować drugi widok modalny.

Oto pełny ślad stosu dla kompletności:

** 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
Mam nadzieję, że to pomoże.
 5
Author: Daniel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-04 23:25:51

* * jak zostało powiedziane wcześniej, użyj 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];
    }
 4
Author: user353877,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-23 19:53:06

Jest możliwe, jeśli otrzymujesz to po kliknięciu przycisku, który był połączony z Twoim kodem w Kreatorze interfejsów, że masz dwie akcje połączone z jednym przyciskiem (może jeśli masz widok modalny połączony z przyciskiem, a następnie zduplikowany przycisk i połączony inny widok modalny). To spróbuje odpalić ich obu i dlatego nie powiedzie się z tą wiadomością.

 3
Author: Simon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-09 20:49:10

Napotkałem ten sam wyjątek

Kończenie aplikacji z powodu nieprzewidzianego wyjątku 'NSInternalInconsistencyException', powód: 'próba rozpoczęcia przejścia modalnego Od Do, gdy przejście jest już w toku. Poczekaj, aż viewDidAppear / viewDidDisappear dowie się, że obecne przejście zostało zakończone "

Jak sugerowałem wcześniej próbowałem opóźnić prezentację przejścia modalnego, ale to nie pomogło. Następnie okazało się, że mam Wiele IBActions połączone touchupinside event mojego przycisku!!!. W moim przypadku rozpoczynałyby się dwie IBActions: prezentowanie modalnie selektora osób i prezentowanie modalnie selektora obrazów. To wyjaśnia komunikat o błędzie. Sprawdź, czy masz podłączone wiele IBActions!

 3
Author: Eddy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-25 12:20:07

Twój problem jest najprawdopodobniej w metodzie inits i przedstawia metodę viewdidappear lub w metodzie INIT/viewDidLoad / viewWillAppear LoadViewController.

Ustaw kilka punktów przerwania i śledź do awarii...

 1
Author: Jordan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-11 18:16:45

Miałem podobny błąd podczas klikania na UIButton, aby otworzyć Modal View. Zmieniłem słuchacz UIButton's z UIControlEventAllEvents na UIControlEventTouchUpInside. W zasadzie uruchamiał Widok modalny na Touch Down Inside, a następnie ponownie na Touch Up Inside.

 1
Author: Chris,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-14 19:00:46

Miałem ten sam problem z powodu niedopasowania nazw w

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

I nazwę aktualnego .plik xib.

 1
Author: Alexey Podlasov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-21 05:48:58

Myślę, że ten problem ma coś wspólnego z problemem, który również napotkałem. Jest bardzo łatwy do odtworzenia:

Utwórz nowy projekt Xcode "aplikacja użytkowa". W FlipsideViewController.na wystarczy wstawić następującą metodę:

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

Jeśli to zrobisz, uruchom aplikację, wtedy widok flipside zostanie aktywowany bezpośrednio daleko. Jak tylko naciśniesz przycisk "Gotowe" na widoku flipside, otrzymasz z powrotem do Mainview, który ponownie uruchamia viewDidAppear i przechodzi z powrotem na drugą stronę- widok. Gdy tylko zostanie wyświetlony flipside-view, aplikacja zatrzyma się - brak pamięci deallokatory są nazywane - to jest tak, jak nacisnąłeś przycisk home.

Kiedy używałem dodatkowych właściwości w tych widokach, otrzymałem również wyjątek, więc rozebrałem kod do minimalnej kwoty...

Naprawdę nie mam pojęcia, na czym polega ten problem... Pozdrawiam, Tobias
 1
Author: Tobias,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-26 06:33:00

To naprawdę zależy od tego, co robią procedury wsparcia dla viewDidAppear. Na przykład, jeśli presentModalViewController:animated: nie zachowuje loader, awaria może być spowodowana UIWindowController próbami mówienia o loader, które zostały wydane (na końcu procedury, którą opublikowałeś).

 0
Author: fbrereto,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-11 16:48:49

Miałem podobny problem przy użyciu tej samej techniki, co ty, aby zaimplementować widok ładowania. Spowoduje to awarię, gdy Widok ładowania zostanie odrzucony pod koniec obciążenia. W moim przypadku problem wynikał z faktu, że jak tylko widok ładowania został odrzucony viewDidAppear został wywołany ponownie i próbował ponownie przedstawić widok ładowania, co prawdopodobnie wywołało awarię. Naprawiłem to po prostu sprawdzając, czy Widok ładowania był przedstawiony wcześniej:

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

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

Wtedy ustawiłem needDisplayLoader to NO przed odrzuceniem widoku Loader

Mam nadzieję, że to pomoże...
 0
Author: Rom,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-09 15:10:32

Wpadłem właśnie na ten problem i poprawiłem go za pomocą selektora:po sugestii powyżej. Dodam tylko, że skompilowałem (bez poprawki) pod iPhone OS 4.0 beta i bez awarii! Tak, błąd w XCode wydaje się być naprawiony w następnej generacji. nie, że to robi każdy z nas jakieś dobre dzisiaj, ale, tak wszyscy wiedzą, to naprawdę był błąd w Xcode i niekoniecznie wszystko, co robiliśmy źle w naszych stylach kodowania.

 0
Author: pulseft,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-20 04:00:42

Miałem dokładnie ten sam problem. Rozwiązałem to z powyższymi sugestiami...

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

Musiał użyć 0.5 sek opóźnienia. Prawdopodobnie dlatego, że wykonywałem presentModalViewController bezpośrednio po modalu UIPickerViewController.

 0
Author: Nate Potter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-03 02:04:49

Właśnie miałem ten problem i okazało się, że mój problem był ponieważ byłem dealloc mój protokół delegata.

 0
Author: NixonsBack,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-07 20:33:17

Myślę, że powodem tej pętli jest to, że nowy kontroler widoku, który ładujesz, ma domyślnie metodę viewDidAppear i ma

[super viewDidAppear animated];

Co oznacza, że ponownie oddzwoni do kontrolera widoku głównego viewDidAppear, w taki sposób, że przejdzie w pętlę

W Viewcontroller, który prezentujesz, masz taką metodę, bez super viewdidapper:

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

}
 0
Author: NSGodMode,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-26 21:47:28

EXC_BAD_ACCESS to błąd pamięci. Prawdopodobnie próbujesz użyć obiektu, który został już zwolniony / dealokowany. Ta odpowiedź daje kilka wskazówek dotyczących debugowania tych problemów:

Debugowanie EXC_BAD_ACCESS

 -2
Author: pix0r,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:58:16