2011-12-19 14 views
26

Mam UITabBarController, po pierwszym uruchomieniu chcę nadpisać kontroler widoku logowania, ale otrzymałem błąd.Niesymetryczne wywołania przejść do początku/końca dla UITabBarController

Połączenia asymetryczne do przejść między wyglądem początkowym i końcowym dla < UITabBarController: 0x863ae00>.

Poniżej znajduje się kod.

- (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; 
} 

Ktoś, kto może mi pomóc? Z góry dziękuję!

+0

Również sprawdziłem to [http://stackoverflow.com/q/7886096/527539]. Ale bez powodzenia. – ZYiOS

Odpowiedz

76

Musisz poczekać na zaprezentowanie modalnego kontrolera widoku do następnej pętli uruchamiania. Skończyło się za pomocą bloku (aby uczynić to bardziej proste), aby zaplanować prezentację dla następnej pętli uruchomić:

Aktualizacja:
Jak wspomniano Mark Amery poniżej, tylko prosty dispatch_async prac, nie ma potrzeby timer:

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

Nie trzeba tu zegara, przynajmniej w przypadku, w którym miałem (w którym odpowiedź rozwiązała moje ostrzeżenie). Właśnie do 'dispatch_async (dispatch_get_main_queue()^(void) { [self.container presentModalViewController: bd animowany TAK]; });' który jest prostszy i mniej hacky. –

+0

Całkowicie zgadzam się z Mark, łatwiej jest użyć 'dispatch_async (dispatch_get_main_queue(), {code block}) – Dean

+7

' dispatch_async() 'nie działało na iOS8 dla mnie, ale' dispatch_after() 'działało. Wadą tego jest to, że widzę rootViewController na chwilę (z powodu opóźnienia 0.1f). – SoftDesigner

10

Podejrzewam, że problem polega na tym, że próbujesz zadzwonić pod numer presentModalViewController:, zanim pasek ładowania się zakończy. Spróbuj przenieść ostatnią logikę do następnej pętli zdarzeń:

[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

Cześć Rob, dzięki za odpowiedź! Rozwiązał mój problem! – ZYiOS

+0

[self performSelector: (handleLogin) withObject: nil afterDelay: 0.1]; pracuję na moim iPodzie 4G, jeśli opóźnienie wynosi 0, działa tylko na symulatorze, ale dostaje takie samo ostrzeżenie w urządzeniu. – ZYiOS

+0

Dziękuję, dziękuję, dziękuję. Wybrana odpowiedź ma ten sam pomysł, ale jest znacznie bardziej skomplikowana i to zadziałało dla mnie świetnie. –

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

To działa dla mnie --- +1 –

+0

Działa świetnie! +1 – Nanego

+4

to obejście nie jest rozwiązaniem. – Karsten

2

miałem podobny problem, gdy T do widoku presentModalViewController (mój ekran powitalny) w widoku widoku głównegoWillAppear. Zostało to rozwiązane przez przeniesienie modalnego wywołania VC do viewDidAppear.

0
[self performSelector:@selector(modaltheView) withObject:self afterDelay:0.1]; 
-(void)modaltheView 
{ 
    [self.container presentModalViewController:nc animated:YES]; 
} 
Powiązane problemy