Warning: Attempt to present on

錯誤提示:iOS 7.1環境下測試沒問題,換到ios8環境下回報這個錯誤Warning: Attempt to present <UINavigationController: 0x6e8ade0> on <LoginViewController: 0x6b3ef90> whose view is not in the window hierarchy!

1. 代碼邏輯是:

LoginViewController在登錄後會present到一個UINavigationController,在這個UINavigationController中,會有監聽事件,監聽到後會present到另一個新的UINavigationController,這個錯誤就是跳轉的時候引起的,我用的-(UIViewController *)getCurrentRootViewController這個函數來獲取當前頂層的控制器,可是到ios8環境下,這個檢測不到LoginViewController以後全部得viewcontroller,好像只能顯示window的rootviewcontroller請問怎麼解決php

//獲取當前viewcontroller
-(UIViewController *)getCurrentRootViewController {
    UIViewController *result;
    // Try to find the root view controller programmically
    // Find the top window (that is not an alert view or other window)
    UIWindow *topWindow = [[UIApplication sharedApplication] keyWindow];
    if (topWindow.windowLevel != UIWindowLevelNormal)
    {
        NSArray *windows = [[UIApplication sharedApplication] windows];
        for(topWindow in windows)
        {
            if (topWindow.windowLevel == UIWindowLevelNormal)
                break;
        }
    }
    UIView *rootView = [[topWindow subviews] objectAtIndex:0];
    id nextResponder = [rootView nextResponder];
    if ([nextResponder isKindOfClass:[UIViewController class]])
        result = nextResponder;
    else if ([topWindow respondsToSelector:@selector(rootViewController)] && topWindow.rootViewController != nil)
        result = topWindow.rootViewController;
    else
        NSAssert(NO, @"ShareKit: Could not find a root view controller.  You can assign one manually by calling [[SHK currentHelper] setRootViewController:YOURROOTVIEWCONTROLLER].");
    return result;
}

1.解決方法:ios

看了一下你的代碼,你不該該用 [self getCurrentRootViewController] 去present ,
由於當第一次present以後,此時window上面的頂級視圖是 ffViewController ,這時候若是你繼續present 須要 用 ffViewController 這個對象。

我大概理解你的想法是 想當前的controller 直接 模態
經過我下面的函數能夠獲取當前的controller  (    [[self topViewController] presentViewController:[[UIViewController alloc] init] animated:YES completion:nil];)
- (UIViewController*)topViewController
{
    return [self topViewControllerWithRootViewController:self.window.rootViewController];
}

- (UIViewController*)topViewControllerWithRootViewController:(UIViewController*)rootViewController
{
    if ([rootViewController isKindOfClass:[UITabBarController class]]) {
        UITabBarController *tabBarController = (UITabBarController *)rootViewController;
        return [self topViewControllerWithRootViewController:tabBarController.selectedViewController];
    } else if ([rootViewController isKindOfClass:[UINavigationController class]]) {
        UINavigationController* navigationController = (UINavigationController*)rootViewController;
        return [self topViewControllerWithRootViewController:navigationController.visibleViewController];
    } else if (rootViewController.presentedViewController) {
        UIViewController* presentedViewController = rootViewController.presentedViewController;
        return [self topViewControllerWithRootViewController:presentedViewController];
    } else {
        return rootViewController;
    }
}

參考:http://www.cocoachina.com/bbs/read.php?tid=295517windows

相關文章
相關標籤/搜索