如何在我的應用中獲取對頂部可見視圖控制器的引用。我看到一些使用navigationcontroller的解決方案。[top | visible] viewcontroller。但我不在我的應用程序中使用導航控制器。在iOS中獲取對頂部視圖控制器的引用
這似乎是一個很常見的情況,我覺得很奇怪,很難獲得進入頂部|可見視圖控制器
如何在我的應用中獲取對頂部可見視圖控制器的引用。我看到一些使用navigationcontroller的解決方案。[top | visible] viewcontroller。但我不在我的應用程序中使用導航控制器。在iOS中獲取對頂部視圖控制器的引用
這似乎是一個很常見的情況,我覺得很奇怪,很難獲得進入頂部|可見視圖控制器
或許你也應該在這裏使用委託模式(給孩子視圖控制器引用它可以調用的對象)。如果你編輯你的帖子來解釋爲什麼你認爲你需要參考頂視圖控制器,我們可以給你建議如何在你的情況下使用委託模式。
但現在我只是給你的繩子,你需要掛自己:
UIViewController *topVC = [UIApplication sharedApplication].keyWindow.rootViewController;
這也應該遵守模態的意見和導航控制器(如果有的話):
- (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;
}
}
很好的答案,非常感謝。 –
-(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;
}
-(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;
}
你又回答同樣的問題了嗎?如果您認爲自己找到了更好的解決方案,那麼可以考慮刪除舊帖子。謝謝。 – Pang
所以你在你的情況下使用什麼? – iDev