2013-10-21 45 views
0

我知道這已被問及一百萬次,但我無法在許多問題中找到合適的答案,已經檢查過。警告:嘗試在<UINavigationontroller>上呈現其視圖不在窗口層次結構中的<CustomViewController>

我有一個自定義視圖控制器,我試圖顯示視圖控制器時,用戶點擊一個按鈕(所以沒有「臭名昭着的viewDidLoad問題」在這裏)。

這裏是我的代碼運行,當用戶點擊該按鈕:(我有NIB的視圖控制器,我有一個導航控制器)

ICLoginViewController *loginViewController = [[ICLoginViewController alloc] initWithNibName:@"ICLoginViewController" bundle:[NSBundle mainBundle]]; 
//assuming we have a navigation controller. 

UINavigationController *navigationController= (UINavigationController*)[[UIApplication sharedApplication] keyWindow].rootViewController; 
[navigationController.topViewController presentViewController:loginViewController animated:YES completion:nil]; 

,我發現了Warning: Attempt to present <ICLoginViewController: 0xa08a810> on <UINavigationController: 0xa45de70> whose view is not in the window hierarchy!錯誤,當我嘗試呈現視圖控制器。屏幕上沒有任何反應。如果我多次點擊,我會得到同樣的錯誤,但仍然沒有任何反應。我已經設置了一個斷點並驗證了navigationControllernavigationController.topViewController不是nil。我'使用故事板(如果有幫助),但不是我試圖顯示的自定義視圖控制器。 (從長遠來看,我想讓它成爲一個獨立於應用程序的庫,所以我沒有引用任何特定於應用程序的模塊)爲什麼會出現此錯誤?

+0

是否有一個特定的原因,爲什麼不使用self.navigationController? – Adis

+0

是的,我喜歡。我將這段代碼放在一個單獨的文件中,這個文件將獨立於應用程序,並且這裏的'self'只是一個NSOBject派生的自定義類,而不是視圖控制器。 –

回答

1

我找到了解決方案。問題是,我的模態顯示視圖控制器不是導航控制器中的'頂部'視圖控制器。如果我更改調用視圖控制器而不是模態,那麼它將成爲頂級視圖控制器,並且我的應用程序運行良好。顯然,這與我的自定義視圖控制器無關,但是我的導航堆棧。

0

如果它在NSObject中創建一個NSObject內的方法,它將當前viewController作爲參數並將其呈現在其中。 如:

-(void)presentInViewController:(UIViewController *)controller{ 
    ICLoginViewController *loginViewController = [[ICLoginViewController alloc] initWithNibName:@"ICLoginViewController" bundle:[NSBundle mainBundle]]; 
    [controller presentViewController:loginViewController animated:YES completion:^(BOOL comp){}]; 
} 

這樣,不管你想要的,而不是試圖找到從通過的的UIApplication導航堆棧你的方式,你可以調用視圖控制器。

+0

我不想處理從應用程序呈現視圖控制器。它只會調用登錄方法,並且我的庫將在適當的情況下顯示登錄視圖控制器(請閱讀:用戶未登錄或訪問令牌無效)。我已經將自定義視圖控制器封裝在框架中(至少,實際上),我不希望用戶直接訪問視圖控制器。 –

+0

您仍然需要從屏幕上的另一個視圖控制器呈現視圖控制器。從查看您的錯誤,您呈現的控制器實際上並不在屏幕上。使用上述方法並將其放入您創建的NSObject中,您應該能夠阻止他們嘗試使用登錄控制器訪問的視圖控制器。 –

+0

是的我剛纔發現我的模式視圖控制器(我從那裏調用這個方法)並不等於頂視圖控制器。如果我改變它推繼續,那麼一切都解決了,我的頂視圖控制器是當前的。我不知道爲什麼會發生這種情況.. –

相關問題