2

我有一個UITabBarController,一個選項卡是一個UINavigationController。我有一個搜索欄,在UINavigationController中進入某個視圖。問題是,如果第一視圖不是由UINavigationController的推動,比它崩潰了,因爲我的搜索沒有這個調用識別visibleViewController:UINavigationController visibleViewControllers

UINavigationController *navController = [self.MainTab.viewControllers objectAtIndex:1]; 
FirstViewController *fVC = [navController visibleViewController]; 

我不明白的是,這個代碼之前,我這樣做:

self.MainTab.selectedIndex = 1; 

這段代碼自己選擇該選項卡中的viewController,然後視圖被加載到我的知識。所以這應該不足以讓[navController visibleViewController]獲取當前的viewController嗎?謝謝。

+0

'[navController visibleViewController]'返回什麼?什麼是崩潰消息? – sergio

+0

@sergio我得到無法識別的選擇器發送到實例的崩潰消息?我如何檢查visibleViewController返回的內容,因爲如果它崩潰,我的FirstViewController沒有正確的信息? – Crystal

+0

似乎'navController'不是'UINavigationController',這就是爲什麼調用'visibleViewController'失敗的原因......你確定你用來從self.MainTab.viewControllers獲得它的索引嗎? – sergio

回答

1

從你在你的問題和評論解釋,我明白你的代碼試圖訪問FirstViewController類型的對象,據說第一個視圖被推到您的UINavigationController,尚未創建時。另一方面,如果您首先以編程方式選擇選項卡,則會創建視圖並且一切正常。事實上,該視圖是在選中選項卡時運行的viewDidLoad方法中創建的。

我建議的解決方案是避免直接從您的搜索選項卡訪問UINavigationControllervisibleViewController;相反,讓您的搜索代碼訪問您的應用程序的模型(如在模型視圖控制器中)並在那裏存儲結果;然後,從提到的viewDidLoad方法再次訪問模型來讀取搜索結果並更新/顯示UI。

這是清潔解決方案,國際海事組織。如果您需要針對當前設計的一種解決方法,請檢查您從visibleViewController得到的fVC值,如果不符合預期,請正確實例化該視圖。

我希望這會有所幫助。

5

嘗試topViewController而不是visibleViewController

FirstViewController *fVC = [navController topViewController]; 
+0

不幸的是我得到了同樣的錯誤。未經選擇的選擇器發送給實例。 – Crystal

0

我知道這已被回答,但我發現了另一個可能有用的解決方案。在我來說,我是不同的處理旋轉我NavigationController內的一些viewControllers,我做了以下內容:

子類的UINavigationController,則需要在新的子類,你可以訪問當前visibleViewController的標題像這樣:

- (BOOL)shouldAutorotate 
{ 
    if ([[self visibleViewController].title isEqualToString:@"Special Case"]) { 
     return NO; 
    } 
    return YES; 
} 

這不是特定於旋轉,這正是我用它的。您唯一需要做的就是爲您正在檢查的每個viewController在viewDidLoad中設置self.title,如果它們在IB中設置或未設置,它們將是nil