10

如何檢查當前是否顯示UIViewController如何檢查當前是否顯示UIViewController?

我的UIViewControllers正在收聽NSNotifications - 即使他們沒有顯示(即未顯示)。所以我可以在後臺觀察NSNotifications從。當NSNotification被髮布並被UIViewController收到時,我想知道它是否正在顯示。如果不是,我將只設置一個布爾值,以便在視圖呈現時處理它。如果它現在正在顯示,我會做更多的事情,比如立即更新表格等等......

+0

您如何呈現視圖控制器的視圖? – tdubik

+0

@tdubik:傳統的方式,像pushViewController。我沒有使用StoryBoard或繼續使用。 – ikevin8me

+0

在這種情況下,您可以從'UINavigationController'類中檢查'topViewController'。或者,如果你想處理更多的一個控制器枚舉'viewControllers'數組。 – tdubik

回答

13

您需要檢查您的viewcontroller位於navigationcontroller的viewcontroller數組的堆棧之上。樣本代碼,

if (self.navigationController.topViewController == self) { 
    //the view is currently displayed 
} 

您可以使用此方法viewWillAppear裏面來檢查當前視圖是否可見。

+1

@ DBD的答案是一個更通用的答案,因爲問題標題不是特定的,對未來的讀者會更有幫助。 – Zedenem

1

爲什麼不移除viewWillDisappear中的通知偵聽器並將它添加到viewWillAppear中?

編輯:誤讀他的問題,對不起。

建議的答案:在viewDidDisappear和viewDidAppear中設置自己的標誌(BOOL)。

+0

這不起作用,因爲它會在刪除所有通知時丟失。 – ikevin8me

+0

那麼在viewWillDisappear中設置一個標誌(BOOL)以表明視圖不再可見。當它收到通知時,請檢查該標誌以查看視圖是否可見。 – yuf

+0

如果通知來了,我需要重新加載表格。如果它不來,那麼這樣做太昂貴了。此外,出於同樣的原因,當視圖重新出現時不需要重新加載表:數據是相同的並且太昂貴。 – ikevin8me

0

我認爲應該檢查viewController.view.superview

+0

我不太明白。你如何做比較? – ikevin8me

+0

'if(viewController.view.superview!= nil)' – tdubik

+0

問題是,您的視圖可能會附加到超級視圖,但該超級視圖可能未附加到您的窗口,因此存在潛在的漏洞,無法工作。 – DBD

6

檢查它是否連接到窗口。如果不是nil它在層次結構中其安裝到屏幕(當然也可能是關閉屏幕的界限,通過一些其他視圖覆蓋或有隱藏的標誌)

if (myViewController.view.window) { 
    // I'm attached to the window 
} else { 
    // not attached to the window 
} 
+1

關閉,但你應該在檢查視圖是否在窗口前檢查是否加載了視圖:'if(self.isViewLoaded && self.view.window!= nil)...' –

+0

@rob。是的,你是對的。如果視圖控制器未加載並且您訪問'view'對象,則會導致延遲加載,這可能意味着將內容加載到內存中,而您並未準備好使用它。雖然它仍然會給出正確的答案,但它會表現出不理想的表現。我假設通知只會在視圖加載時才被添加,而不是初始化,因爲未初始化的視圖將永遠不會被附加。不過這可能是一個不恰當的假設,如果沒有其他的話,應該說明一個假設。 – DBD

+0

這應該是真正的答案,集成@ robmayoff的變化。 – Bill

4

您可以使用viewWillAppearviewWillDisappear方法中的標誌。

1

指定每個ViewController的標題,然後按照下面的代碼獲取當前ViewController的標題。

NSString *currentController = self.navigationController.visibleViewController.title; 

Then check it by your title like this 

if([currentController isEqualToString:@"myViewControllerTitle"]){ 

    //write your code according to View controller. 

} 
相關問題