presentViewController over TabBarController 导致“尝试在其视图不在窗口层次结构中的 TabBarVC 上呈现 *VC”

Posted

技术标签:

【中文标题】presentViewController over TabBarController 导致“尝试在其视图不在窗口层次结构中的 TabBarVC 上呈现 *VC”【英文标题】:presentViewController over TabBarController causes "attempt to present *VC on TabBarVC whose view is not in the window hierarchy" 【发布时间】:2014-04-15 19:15:15 【问题描述】:

我的根视图控制器是加载在委托中的选项卡栏控制器。每个选项卡都是一个表格视图控制器。首次加载应用程序时,我希望通过 presentViewController 弹出一个登录屏幕,我在 Tab Bar Controller 的 viewDidLoad 方法中有该登录屏幕。它导致了我读过的窗口层次结构错误——尽管没有一个解决方案对我有用。我尝试在第一个选项卡的 viewDidLoad 方法中显示模态视图,但这导致了同样的错误。

在 viewDidLoad 中的标签栏视图控制器中,我的代码是:

 CLLoginViewController *loginVC = [[CLLoginViewController alloc] init];
    loginVC.delegate = self;
    [self.view addSubview:loginVC.view];
    [self presentViewController:loginVC animated:NO completion:nil];

【问题讨论】:

【参考方案1】:

你的问题很模糊,但我理解的是,你想在加载 tabController 之前显示一个登录屏幕。

所以更好的方法是,在你的 AppDelegate 中设置窗口的 rootViewController 时,做这样的事情

if([[NSUserDefaults standardUserDefaults] boolForKey:@"showTabBar"])
     self.window.rootViewController  = tabBarControllerObject;   //TabBarView is loaded
     [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"showTabBar"];

else
     self.window.rootViewController  =   tabBarControllerObject;   //Login Screen is loaded for first time.

希望对你有帮助

【讨论】:

感谢回复,我试试看。只是为了提供更多信息:我的应用程序的整体结构是 - 1. App Delegate 2. Tab Bar View Controller 3. 每个 Tab Bar 都是一个 TableView 控制器。当我插入 UINavigation Controller 作为根视图控制器(1. App Delegate 2.UINaviationController 3. UITabViewController 4. TableViewControllers)时,似乎在标签栏控制器中我可以呈现ViewController:loginVC 没有任何问题。我很困惑为什么会这样。

以上是关于presentViewController over TabBarController 导致“尝试在其视图不在窗口层次结构中的 TabBarVC 上呈现 *VC”的主要内容,如果未能解决你的问题,请参考以下文章

PresentViewController切换界面

找不到 presentViewController

堆叠 presentViewController 后 statusBarFrame = 0

PresentViewController 故障排除

presentViewController 过渡动画

presentViewController 的动画属性