2010-09-09 230 views
46

可能重複:
How to tell if UIViewController's view is visible如何檢查特定UIViewController的視圖當前是否可見?

我開發處理從網絡輸入數據的恆定流,並且提供許多不同的UIViews的供用戶查看的應用程序數據。

當某些模型數據基於來自網絡的傳入流進行更新時,我訪問關聯的UIViewController或UITableViewController並對其執行-setNeedsDisplay(對於UIViewController)或-reloadData(對於UITableViewController)。

有沒有辦法來檢查給定的UIView是否正在顯示(不只是被加載),以便我只做-setNeedsDisplay或-reloadData如果用戶正在查看該UIView?看起來在用戶目前沒有看到的視圖上調用-setNeedsDisplay或reloadData會浪費處理能力,並且不利於電池壽命。當用戶最終切換到先前更新的視圖時,在-viewWillAppear上執行-setNeedsDisplay或reloadData將更有意義。

感謝

+0

http://stackoverflow.com/questions/2777438/how-to-tell-if-uiviewcontrollers-view-is-visible/2777460#2777460 – LolaRun 2011-11-29 21:28:58

+0

我不能添加另一個答案,但現在有一個屬性在視圖控制器上稱爲isVisible – 2017-10-04 07:18:20

回答

132

做了一些研究之後,我發現了張貼在這裏一個不同的問題,這個答案......這似乎是最好的方式......

的視圖的窗口屬性是非零如果一個觀點是目前可見的,所以檢查主視圖在視圖控制器:

if (viewController.isViewLoaded && viewController.view.window){ 
    // viewController is visible 
} 
+5

我剛剛編輯[另一個問題](http://stackoverflow.com/questions/2777438/how-to-tell-if-uiviewcontrollers-view-is-visible/2777460#2777460)也首先檢查isViewLoaded以避免意外加載以上代碼將執行的視圖。進行測試:'if(viewController.isViewLoaded && viewController.view.window)...' – progrmr 2011-03-23 21:23:28

+1

這個答案不應該被標記爲正確的,因爲它會觸發加載VC的視圖。請參閱上面鏈接的程序員回答。 – 2012-02-07 04:21:38

+2

這會讓你對被其他模態顯示的viewControllers遮擋的viewControllers誤報 - >不正確。這樣做是可靠的檢查viewController是不可見的,但不是相反。 – Till 2012-02-13 16:43:31

12

添加到您的控制器,或者的UIViewController的子類,然後你可以進一步繼承。訪問它使用屬性或變量:

- (void)viewDidAppear:(BOOL)animated 
{ 
[super viewDidAppear:animated]; 
visible = YES; 
} 

- (void)viewWillDisappear:(BOOL)animated 
{ 
visible = NO; 
[super viewWillDisappear:animated]; 
} 
+1

另外,不要將它作爲一個類別。重新定義類別中的方法是不好的做法。 – 2011-03-01 19:38:36

+1

這將是一個類別中的災難,因爲您無法在viewDidAppear或ViewWillAppear上定義任何特定於類的行爲。 – jpswain 2012-01-10 22:55:33

+0

當然,您仍然可以定義類特定的行爲。您可以重寫方法並仍然調用超級方法。儘管這是一箇舊帖子,但我發現一個類別不會有用,因爲您需要存儲「可見」。我會編輯它。 – 2012-01-11 00:09:39

-4

只是爲了保持完整性,我想我會在如何確定視圖控制器是添加在基於標籤的應用中顯示:

+(BOOL) isSelectedViewController:(UIViewController *)someVC; 
{ 
    myAppDelegate *appD = [[UIApplication sharedApplication] delegate]; 
    UIViewController *selectedVC = [appD.TabBarController selectedViewController]; 

    return selectedVC == someVC; 
} 
+2

假設你將導航控制器嵌套在標籤欄控制器中,它會更好用(myViewController.tabBarController.selectedViewController == myViewController.navigationController)。 – Johnus 2012-03-06 00:54:07

+0

我想如果你知道子控制器是一個導航控制器,但通常情況並非如此。 – 2012-04-06 16:13:02

相關問題