2012-11-14 55 views
1

如何在我的應用中獲取對頂部可見視圖控制器的引用。我看到一些使用navigationcontroller的解決方案。[top | visible] viewcontroller。但我不在我的應用程序中使用導航控制器。在iOS中獲取對頂部視圖控制器的引用

這似乎是一個很常見的情況,我覺得很奇怪,很難獲得進入頂部|可見視圖控制器

+0

所以你在你的情況下使用什麼? – iDev

回答

1

或許你也應該在這裏使用委託模式(給孩子視圖控制器引用它可以調用的對象)。如果你編輯你的帖子來解釋爲什麼你認爲你需要參考頂視圖控制器,我們可以給你建議如何在你的情況下使用委託模式。

但現在我只是給你的繩子,你需要掛自己:

UIViewController *topVC = [UIApplication sharedApplication].keyWindow.rootViewController; 
3

這也應該遵守模態的意見和導航控制器(如果有的話):

- (UIViewController *)deepestPresentedViewControllerOf:(UIViewController *)viewController 
{ 
    if (viewController.presentedViewController) { 
     return [self deepestPresentedViewControllerOf:viewController.presentedViewController]; 
    } else { 
     return viewController; 
    } 
} 

- (UIViewController *)topViewController 
{ 
    UIViewController *rootViewController = [[[UIApplication sharedApplication] keyWindow] rootViewController]; 
    UIViewController *deepestPresentedViewController = [self deepestPresentedViewControllerOf:rootViewController]; 
    if ([deepestPresentedViewController isKindOfClass:[UINavigationController class]]) { 
     return ((UINavigationController *)deepestPresentedViewController).topViewController; 
    } else { 
     return deepestPresentedViewController; 
    } 
} 
+0

很好的答案,非常感謝。 –

0
-(UIViewController *)getCurrentViewController 
{ 
    UIViewController *result = nil; 
    UIWindow * window = [[UIApplication sharedApplication] keyWindow]; 
    if (window.windowLevel != UIWindowLevelNormal) 
    { 
     NSArray *windows = [[UIApplication sharedApplication] windows]; 
     for(UIWindow * tmpWin in windows) 
     { 
      if (tmpWin.windowLevel == UIWindowLevelNormal) 
      { 
       window = tmpWin; 
       break; 
      } 
     } 
    } 
    UIView *frontView = [[window subviews] objectAtIndex:0]; 
    id nextResponder = [frontView nextResponder]; 

    if ([nextResponder isKindOfClass:[UIViewController class]]) 
     result = nextResponder; 
    else 
     result = window.rootViewController; 
    return result; 
} 
0
-(UIViewController *) getTopMostController 
{ 
    UIWindow *topWindow = [UIApplication sharedApplication].keyWindow; 
    if (topWindow.windowLevel != UIWindowLevelNormal) 
    { 
     topWindow = [self returnWindowWithWindowLevelNormal]; 
    } 

    UIViewController *topController = topWindow.rootViewController; 
    if(topController == nil) 
    { 
     topWindow = [UIApplication sharedApplication].delegate.window; 
     if (topWindow.windowLevel != UIWindowLevelNormal) 
     { 
      topWindow = [self returnWindowWithWindowLevelNormal]; 
     } 
     topController = topWindow.rootViewController; 
    } 

    while(topController.presentedViewController) 
    { 
     topController = topController.presentedViewController; 
    } 

    if([topController isKindOfClass:[UINavigationController class]]) 
    { 
     UINavigationController *nav = (UINavigationController*)topController; 
     topController = [nav.viewControllers lastObject]; 

     while(topController.presentedViewController) 
     { 
      topController = topController.presentedViewController; 
     } 
    } 

    return topController; 
} 

-(UIWindow *) returnWindowWithWindowLevelNormal 
{ 
    NSArray *windows = [UIApplication sharedApplication].windows; 
    for(UIWindow *topWindow in windows) 
    { 
     if (topWindow.windowLevel == UIWindowLevelNormal) 
      return topWindow; 
    } 
    return [UIApplication sharedApplication].keyWindow; 
} 
+0

你又回答同樣的問題了嗎?如果您認爲自己找到了更好的解決方案,那麼可以考慮刪除舊帖子。謝謝。 – Pang

相關問題