2011-02-04 2 views
3

У меня есть этот сбой. Он похож на другие потоки, но не то же самое. Я хотел бы показать контроллер модального представления, сначала пользователь переходит к определенному контроллеру вида. Следуя подсказкам, я делаю это на - (void) viewDidAppear: (BOOL) анимированным и применяю задержку, поскольку я видел, что это рекомендуется.Сбой при представлении модального контроллера

- (void) viewDidAppear:(BOOL)animated 
    { 
     [super viewDidAppear:animated]; 
     [self performSelector:@selector(presentMyModal) withObject:nil afterDelay:1]; 
    } 



    - (void) presentModal{ 
    ModalViewController *modal = [[[ModalViewController alloc] init] autorelease]; 
    [self presentModalViewController:modal animated:YES]; 
    } 

Впоследствии, ramdomly Он падает. Я получаю это сообщение в консоли:

<Warning>: *** Assertion failure in -[UIWindowController transition:fromViewController:toViewController:target:didEndSelector:], /SourceCache/UIKit/UIKit-1447.6.4/UIWindowController.m:186 
Thu Feb 3 10:00:44 unknown MyApp[1830] <Error>: *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Attempting to begin a modal transition from <UINavigationController: 0x454260> to <ModalViewController: 0x47af00> while a transition is already in progress. Wait for viewDidAppear/viewDidDisappear to know the current transition has completed' 
    *** Call stack at first throw: 
    (
     0 CoreFoundation      0x3759dc7b __exceptionPreprocess + 114 
     1 libobjc.A.dylib      0x32d9bee8 objc_exception_throw + 40 
     2 CoreFoundation      0x3759dac3 +[NSException raise:format:arguments:] + 70 
     3 Foundation       0x351a3e73 -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 62 
     4 UIKit        0x359e92a8 -[UIWindowController transition:fromViewController:toViewController:target:didEndSelector:] + 208 
     5 UIKit        0x359e8c98 -[UIViewController presentModalViewController:withTransition:] + 2792 
     6 UIKit        0x35a7b51c -[UIViewController _tryRecursivelyPresentModalViewController:withTransition:] + 116 
     7 UIKit        0x359e84c0 -[UIViewController presentModalViewController:withTransition:] + 784 
     8 UIKit        0x359e8060 -[UIViewController presentModalViewController:animated:] + 96 
     9 MyApp       0x0005d57f -[MyAppViewController presentMyModal] + 58 
     10 Foundation       0x351724db __NSFireDelayedPerform + 366 
     11 CoreFoundation      0x37552305 __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 16 
     12 CoreFoundation      0x37551cd9 __CFRunLoopDoTimer + 988 
     13 CoreFoundation      0x37521a91 __CFRunLoopRun + 1184 
     14 CoreFoundation      0x3752150b CFRunLoopRunSpecific + 226 
     15 CoreFoundation      0x37521419 CFRunLoopRunInMode + 60 
     16 GraphicsServices     0x33e76d24 GSEventRunModal + 196 
     17 UIKit        0x3591d57c -[UIApplication _run] + 588 
     18 UIKit        0x3591a558 UIApplicationMain + 972 
     19 MyApp       0x0000e75f main + 50 
     20 MyApp       0x0000e6e8 start + 52 

Как вы можете видеть, я жду, пока не появится вид. Возможно, это ошибка ОС? Похоже, он пытается представить рекурсивно другие модальные контроллеры представлений, провоцируя сбои. Большое спасибо.

+0

Не могли бы вы сразу показать ModalViewController вместо того, чтобы сначала показывать это другое представление? – willcodejavaforfood

+0

Спасибо за ваш ответ. Предпочтительно нет, мы хотим немного показать представление. Однако мы учтем это. – toupper

+0

У вас есть опечатка в @selector (presentMyModal) - функция называется presentModal. Но я догадываюсь, что вы разделили код перед представлением здесь, иначе он никогда не зайдет так далеко в журнал сбоев ;-) – Mayjak

ответ

0

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

#import "VC1.h" 


@implementation VC1 

- (void) viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 
    [self performSelector:@selector(presentModal) withObject:nil afterDelay:1.0]; 
} 

- (void)presentModal { 
    static int colorChooser = 0; 
    VC1 *vc1 = [[[VC1 alloc] init] autorelease]; 
    switch (colorChooser%2) { 
    case 0: 
     vc1.view.backgroundColor = [UIColor whiteColor]; 
     break; 
    default: 
     vc1.view.backgroundColor = [UIColor blackColor]; 
     break; 
    } 
    colorChooser++; 
    [self presentModalViewController:vc1 animated:YES]; 
} 

@end 

И это работает безупречно после толкнули на навигационном контроллере. Он рекурсивно чередуется между черно-белыми видами, проверенными как в сим, так и на 3G-устройстве.

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

+0

Да, я делаю другие переходы: я использую modal view controller. Я думаю, они оба вступают в конфликт, но я не знаю, почему, поскольку, как я надеюсь, первый полностью уволен, когда вызывается viewDidAppear контроллера вида, представляющего модальное представление. – toupper

0

Наше предпочтительное решение - использовать [UIViewController presentViewController: анимированный: завершение:] и выполнять все, что необходимо для следующего действия (например, представить другой VC) в блоке завершения.

Например:

[self presentViewController:yourViewController animated:YES completion:^{ 
    [yourViewController presentMyModal]; 
}]; 

Этот метод был введен в прошивкой 5.0.

 Смежные вопросы

  • Нет связанных вопросов^_^