2011-12-19 17 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

इसके अलावा, मैंने इसे [http://stackoverflow.com/q/7886096/527539] चेक किया है। लेकिन कोई भाग्य नहीं है। – ZYiOS

उत्तर

76

आप अगले रन पाश जब तक मोडल दृश्य नियंत्रक पेश करने के लिए प्रतीक्षा करनी होगी। मैं एक ब्लॉक (चीजें अधिक सरल बनाने के लिए) का उपयोग कर अगले रन पाश के लिए प्रस्तुति अनुसूची करने के समाप्त हो गया:

अद्यतन:
नीचे मार्क Amery, बस एक साधारण 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: nc एनिमेटेड: हाँ]; });' जो सरल और कम hacky है। –

+0

मैं मार्क के साथ पूरी तरह से सहमत हूं, 'dispatch_async (dispatch_get_main_queue(), {code block}) – Dean

+7

'dispatch_async()' मेरे लिए आईओएस 8 पर काम नहीं किया है, लेकिन '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

[स्वयं प्रदर्शन चयनकर्ता: (हैंडलॉगिन) के साथ ऑब्जेक्ट: शून्य बाद के बाद: 0.1]; मेरे आईपॉड 4 जी में काम करें, अगर देरी का समय 0 है, तो केवल सिम्युलेटर पर काम करेगा, बल्कि डिवाइस में एक ही चेतावनी प्राप्त करेगा। – ZYiOS

+0

धन्यवाद, धन्यवाद, धन्यवाद। चयनित उत्तर में एक ही विचार है, लेकिन अधिक जटिल है, और यह मेरे लिए बहुत अच्छा काम करता है। –

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

यह मेरे लिए काम करता है --- +1 –

+0

बढ़िया काम करता है! +1 – Nanego

+4

यह कामकाज समाधान नहीं है। – Karsten

2

मैं जब टी एक ऐसी ही समस्या थी मुख्य दृश्य के दृश्य में उपस्थित मॉड्यूल व्यू कंट्रोलर (मेरी स्वागत स्क्रीन) प्रस्तुत करने के लिए riedWillAppear। डीडएपियर देखने के लिए मोडल वीसी कॉल को स्थानांतरित करके हल किया गया है।

0
[self performSelector:@selector(modaltheView) withObject:self afterDelay:0.1]; 
-(void)modaltheView 
{ 
    [self.container presentModalViewController:nc animated:YES]; 
} 
संबंधित मुद्दे