2012-11-12 80 views
34

我試圖做一個模式視圖控制器在我的應用程序委託(我創建了一個名爲showLoginView功能)。但每當我嘗試調用它,我在XCode中得到一個警告:試圖提出*月*誰的觀點是不是在窗口層次

Warning: Attempt to present <PSLoginViewController: 0x1fda2b40> on <PSViewController: 0x1fda0720> whose view is not in the window hierarchy! 

這裏的方法代碼:

- (void)showLoginView 
{ 
    PSLoginViewController *loginViewController = [[UIStoryboard storyboardWithName:@"MainStoryboard" bundle:NULL] instantiateViewControllerWithIdentifier:@"PSLoginViewController"]; 
    [self.window.rootViewController presentViewController:loginViewController animated:NO completion:nil]; 
} 

我如何添加視圖到窗口層次?或者,我正在做一些非常錯誤的事情?

回答

29

不能顯示來自的appDelegate模態的視圖控制器。您需要從當前顯示全屏的viewController中顯示一個模式ViewController。換句話說,您需要將該代碼放入您的根視圖控制器中,或者您想要顯示模態vc的那個代碼...

另外,您需要使用「presentModalViewController」方法來呈現模態。您可以設置在模式VC性能,如:

vC.modalPresentationStyle = UIModalPresentationFormSheet; 
vC.modalTransitionStyle = UIModalTransitionStyleCoverVertical; 
[self presentModalViewController:vC animated:YES]; 
+0

但RootViewController的是不是時刻所顯示的一個?我應該如何實現泛型函數,每當用戶憑證檢查失敗時,它可以呈現一個登錄視圖控制器? – patryk

+0

您使用的是導航控制器嗎? – HackyStack

+5

我會使用一個導航控制器,然後你可以得到一個對所顯示的引用,如:displayController = [navController topViewController];然後你可以像上面那樣模態地推動你將自己替換爲displayedController的地方。 – HackyStack

3

可以的NSLog(@ 「%@」,self.window.rootViewController),並看到什麼RootViewController的真實面目。

我來到這個問題,當rootViewController是一個正常的UIViewController。 用UINavigationController代替它,希望它會有所幫助。

19

實際上,你可以,只要你檢測當前可見的viewController,並採取在那裏你當前控制器是navigationController的情況下照顧呈現從AppDelegate中模態視圖控制器。

這裏是我做的:

UIViewController *activeController = [UIApplication sharedApplication].keyWindow.rootViewController; 
if ([activeController isKindOfClass:[UINavigationController class]]) { 
    activeController = [(UINavigationController*) activeController visibleViewController]; 
} 
[activeController presentModalViewController:loginViewController animated:YES]; 
+1

太棒了!有用! – echo

+1

此外,如果您想呈現導航控制器,則可以將'[activeController presentModalViewController:loginViewController animated:YES]'交換爲'[activeController presentViewController:loginNavigationController animated:NO completion:nil]'。 –

+0

太棒了!謝謝。 –

8
UIViewController *activeController = [UIApplication sharedApplication].keyWindow.rootViewController; 
if ([activeController isKindOfClass:[UINavigationController class]]) 
{ 
    activeController = [(UINavigationController*) activeController visibleViewController]; 
} 
else if (activeController.modalViewController) 
{ 
    activeController = activeController.modalViewController; 
} 
[activeController presentModalViewController:vc animated:YES]; 
+0

.modalViewController現已棄用,您現在可以使用activeController.presentedViewController – Pach

7

我遇到了在iOS 7這個問題 - 關鍵作任何提出的解決方案的工作是調用

[self.window makeKeyAndVisible]; 

您的AppDelegate。 通話結束後,從窗口的rootViewController中顯示模態視圖。

+0

我沒有手動加載故事板,所以就是這樣。太感謝了。 – glasz

4

該警告的另一個原因可能是您希望從不是最頂層的視圖控制器的實例呈現視圖控制器。

所以首先你必須讓最上面的UIViewController,並使用此實例調用presentViewController:

UIViewController *root = [UIApplication sharedApplication].keyWindow.rootViewController; 
while (root.presentedViewController) { 
    root = root.presentedViewController; 
} 
+1

Swift 3 UIApplication.shared.keyWindow?.rootViewController?.present(vc,animated:true,completion:nil) – Jason

相關問題