Сбой представления модального контроллера вида - PullRequest
3 голосов
/ 04 февраля 2011

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

<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

Как видите, я жду, пока не появится представление.Это может быть ошибка ОС?Кажется, что он пытается представить рекурсивно другие контроллеры модального представления, провоцируя сбои.Большое спасибо.

Ответы [ 2 ]

0 голосов
/ 03 августа 2012

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

Например:

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

Этот метод был представлен в iOS 5.0.

0 голосов
/ 04 февраля 2011

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

#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.

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

...