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];
}
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];
}
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 + 53Mam nadzieję, że to pomoże.
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];
}
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ą.
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!
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...
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
.
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.
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, TobiasWarning: 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ś).
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...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.
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.
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.
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
}
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:
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