2011-12-19 1 views
26

У меня есть UITabBarController, при первом запуске я хочу наложить контроллер входа в систему, но получил ошибку.Неуравновешенные вызовы для перехода на начало/конец для UITabBarController

Неуравновешенные вызовы для перехода на начало/конец для < UITabBarController: 0x863ae00>.

Ниже приведен код.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    // Override point for customization after application launch. 
    self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease]; 

    // Override point for customization after application launch. 

    UIViewController *lessonVC = [[[LessonViewController alloc] initWithNibName:@"LessonViewController" bundle:nil] autorelease]; 

    UIViewController *programVC = [[[ProgramViewController alloc] initWithNibName:@"ProgramViewController" bundle:nil] autorelease]; 

    UIViewController *flashcardVC = [[[FlashCardViewController alloc] initWithNibName:@"FlashCardViewController" bundle:nil] autorelease]; 

    UIViewController *moreVC = [[[MoreViewController alloc] initWithNibName:@"MoreViewController" bundle:nil] autorelease]; 

    UINavigationController *lessonNVC = [[[UINavigationController alloc] initWithRootViewController:lessonVC] autorelease]; 

    UINavigationController *programNVC = [[[UINavigationController alloc] initWithRootViewController:programVC] autorelease]; 

    UINavigationController *flashcardNVC = [[[UINavigationController alloc] initWithRootViewController:flashcardVC] autorelease]; 

    UINavigationController *moreNVC = [[[UINavigationController alloc] initWithRootViewController:moreVC] autorelease]; 

    self.tabBarController = [[[UITabBarController alloc] init/*WithNibName:nil bundle:nil*/] autorelease]; 
    self.tabBarController.viewControllers = [NSArray arrayWithObjects:lessonNVC, programNVC, flashcardNVC, moreNVC, nil]; 
    self.tabBarController.selectedIndex = 0; 
    self.window.rootViewController = self.tabBarController; 

    [self.window makeKeyAndVisible]; 

    if (![[ZYHttpRequest sharedRequest] userID]) 
    { 
     // should register or login firstly 
     LoginViewController *loginVC = [[LoginViewController alloc] initWithNibName:@"LoginViewController" 
                      bundle:nil]; 
     loginVC.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal; 
     [self.tabBarController presentModalViewController:loginVC animated:YES]; 
     ZY_SAFE_RELEASE(loginVC); 
    } 

    return YES; 
} 

Кто может мне помочь? Заранее спасибо!

+0

Кроме того, I'v проверил это [http://stackoverflow.com/q/7886096/527539]. Но не повезло. – ZYiOS

ответ

76

Вам нужно ждать, чтобы представить модальный контроллер представления до следующего цикла выполнения. Я в конечном итоге, используя блок (чтобы сделать вещи более простыми) планировать презентацию для следующего цикла выполнения:

Update:
Как отметил Марк Эмери ниже, только простой dispatch_async работы, нет необходимости таймер:

dispatch_async(dispatch_get_main_queue(), ^(void){  
    [self.container presentModalViewController:nc animated:YES]; 
}); 

/* Present next run loop. Prevents "unbalanced VC display" warnings. */ 
double delayInSeconds = 0.1; 
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC); 
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ 
    [self.container presentModalViewController:nc animated:YES]; 
}); 
+4

Нет необходимости в таймере здесь, по крайней мере, в том случае, когда у меня был (в котором ваш ответ разрешил мое предупреждение). Просто сделайте 'dispatch_async (dispatch_get_main_queue(),^(пустот) { [self.container presentModalViewController: н.д. анимированный: YES]; });' , который является более простым и менее Hacky. –

+0

Я полностью согласен с Марком, проще просто использовать 'dispatch_async (dispatch_get_main_queue(), {code block}) – Dean

+7

' dispatch_async() 'не работал на iOS8 для меня, но' dispatch_after() 'работал. Недостатком этого является то, что я вижу rootViewController на мгновение (из-за задержки 0,1f). – SoftDesigner

10

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

[self.window makeKeyAndVisible]; 
    [self performSelector:(handleLogin) withObject:nil afterDelay:0]; 
} 

- (void)handleLogin 
{ 
    if (![[ZYHttpRequest sharedRequest] userID]) 
    { 
     // should register or login firstly 
     LoginViewController *loginVC = [[LoginViewController alloc] initWithNibName:@"LoginViewController" 
                      bundle:nil]; 
     loginVC.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal; 
     [self.tabBarController presentModalViewController:loginVC animated:YES]; 
     ZY_SAFE_RELEASE(loginVC); 
    } 
} 
+0

Привет, Роб, спасибо за ваш ответ! Это решило мою проблему! – ZYiOS

+0

[self performSelector: (handleLogin) withObject: nil afterDelay: 0.1]; работа в моем iPod 4G, если время задержки равно 0, будет работать только на симуляторе, но получит такое же предупреждение в устройстве. – ZYiOS

+0

Спасибо, спасибо, спасибо. Выбранный ответ имеет ту же идею, но гораздо сложнее, и это отлично сработало для меня. –

5
[self.tabBarController presentModalViewController:loginVC animated:**NO**]; 
+0

Это работает для меня --- +1 –

+0

Отлично работает! +1 – Nanego

+4

Это обходное решение не является решением. – Karsten

2

у меня была аналогичная проблема, когда т red to presentModalViewController (экран приветствия) в представлении основного видаWillAppear. Решено только путем перемещения модального вызова VC в viewDidAppear.

0
[self performSelector:@selector(modaltheView) withObject:self afterDelay:0.1]; 
-(void)modaltheView 
{ 
    [self.container presentModalViewController:nc animated:YES]; 
} 
Смежные вопросы