2011-09-21 66 views
1

我有一個應用程序有多個視圖。 當我從背景中回到前景時,我想確定當前是哪個視圖。我會怎麼做?如何確定從iOS中的背景返回到前臺時加載哪個視圖?

[編輯]

我明白了navigationController的visibleViewController財產可能的幫助。但是,我想知道如何在與UIViewController對象進行比較時使用它返回的指針。我們如何比較指針?一些代碼片段會非常有幫助。

回答

2

取決於您使用的是什麼根視圖控制器。如果您有導航控制器,則可以檢查visibleViewController屬性以查看哪個視圖控制器當前位於導航堆棧的頂部。對於標籤欄控制器,請檢查selectedViewController屬性以查看哪個標籤處於活動狀態。如果它們是這兩者的組合,則同時使用這兩種方法。

每個容器視圖控制器都提供了某種方式來確定屏幕上選擇了什麼或當前在屏幕上。如果你正在做自己特殊的設置,你必須想出一個很好的方法來自行確定這些信息。

+0

..並且如果您不使用標籤欄或導航欄?你會建議什麼? – bandejapaisa

+0

那麼在這種情況下,你可能只是使用你自己的根視圖控制器,所以它應該是顯而易見的啓動時可見的。 – LucasTizma

+0

我正在使用navigationController。 visibleViewController返回一個UIViewController。如何檢查我想要的UIViewController是否相等 – Namratha

1

您想知道您的應用程序何時進入前臺並變爲活動狀態。這需要位於視圖控制器層次結構的根目錄 - 可能是您的AppDelegate,可能是您的根視圖控制器。

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appActive:) 
               name:UIApplicationDidBecomeActiveNotification 
               object:nil]; 

在appActive:(NSNotification *)notification;或者你稱之爲的任何方法 - 按LucasTizma的建議。

還記得清理你的notifcations當你完成

[[NSNotificationCenter defaultCenter] removeObserver:self]; 
1

我永遠愛涉及的類別,因爲它們是螺栓上,可以方便地重複使用的解決方案。

所以我在UIWindow上創建了一個類。您現在可以在UIWindow上調用visibleViewController,並通過搜索控制器層次結構來獲取可見視圖控制器。如果您正在使用導航和/或標籤欄控制器,這將起作用。如果你有其他類型的控制器建議請讓我知道,我可以添加它。

的UIWindow + PazLabs.h(頭文件)

#import <UIKit/UIKit.h> 

@interface UIWindow (PazLabs) 

- (UIViewController *) visibleViewController; 

@end 

的UIWindow + PazLabs.m(執行文件)

#import "UIWindow+PazLabs.h" 

@implementation UIWindow (PazLabs) 

- (UIViewController *)visibleViewController { 
    UIViewController *rootViewController = self.rootViewController; 
    return [UIWindow getVisibleViewControllerFrom:rootViewController]; 
} 

+ (UIViewController *) getVisibleViewControllerFrom:(UIViewController *) vc { 
    if ([vc isKindOfClass:[UINavigationController class]]) { 
     return [UIWindow getVisibleViewControllerFrom:[((UINavigationController *) vc) visibleViewController]]; 
    } else if ([vc isKindOfClass:[UITabBarController class]]) { 
     return [UIWindow getVisibleViewControllerFrom:[((UITabBarController *) vc) selectedViewController]]; 
    } else { 
     if (vc.presentedViewController) { 
      return [UIWindow getVisibleViewControllerFrom:vc.presentedViewController]; 
     } else { 
      return vc; 
     } 
    } 
} 

@end 
3

zirinisp在斯威夫特答:

extension UIWindow { 
    func visibleViewController() -> UIViewController? { 
     if let rootViewController: UIViewController = self.rootViewController { 
      return UIWindow.getVisibleViewControllerFrom(rootViewController) 

    } 
    return nil 
} 

class func getVisibleViewControllerFrom(vc:UIViewController) -> UIViewController { 
if vc.isKindOfClass(UINavigationController.self) { 

    let navigationController = vc as UINavigationController 
    return UIWindow.getVisibleViewControllerFrom(navigationController.visibleViewController) 

} else if vc.isKindOfClass(UITabBarController.self) { 

    let tabBarController = vc as UITabBarController 
    return UIWindow.getVisibleViewControllerFrom(tabBarController.selectedViewController!) 

} else { 

    if let presentedViewController = vc.presentedViewController { 

     return UIWindow.getVisibleViewControllerFrom(presentedViewController) 

    } else { 

     return vc; 
    } 
} 
} 

用法:

if let topController = window.visibleViewController() { 
      println(topController) 
     } 
相關問題