[英]Can't push to View Controller from AppDelegate without losing Navigation Bar and Tab Bar setup iOS
[英]how to push a view controller to a navigation controller in a tab bar in iOS
我有一个标签栏控制器,每个标签有一个导航控制器。 导航控制器具有视图控制器。 然后,如果用户需要登录或注销,我的登录控制器没有连接到我用以下代码调用的标签栏控制器。
当我尝试根据用户是否登录时有条件地推送视图控制器时,我看到一些奇怪的行为。
我的逻辑看起来像这样:
if(currentUser){
}else{
LoginViewController *svc = [self.storyboard instantiateViewControllerWithIdentifier:@"Login"];
svc.hidesBottomBarWhenPushed = YES;
[self.navigationController pushViewController:svc animated:YES];
}
按下视图时,看起来好像已按下了“登录视图”,并且在其上方推送了另一个“登录视图”。
对于注销,我在segue中有相同的代码:
if ([segue.identifier isEqualToString:@"LogoutView"]) {
[self logOut];
LoginViewController *svc = [self.storyboard instantiateViewControllerWithIdentifier:@"Login"];
svc.hidesBottomBarWhenPushed = YES;
[self.navigationController pushViewController:svc animated:YES];
}
在这个例子中,我看到相同的双推,每次我点击我的登录按钮,它推动另一个登录视图。 这种情况无限发生。 然后我收到警告:
在意外状态下完成导航过渡。 导航栏子视图树可能已损坏。
当我在导航中按回来时,应用程序崩溃并显示错误:
NSInvalidArgumentException',原因:'无法将自己添加为子视图'
我没有正确推送登录视图控制器吗?
Segues实例化新控制器,并执行从源控制器到目标控制器的转换。 因此,您既不应该在代码中实例化控制器,也不应该使用pushViewController推送它:animated:。 如果按钮(而不是控制器)正在触发segue,那么您只需要获取对目标控制器的引用(segue.destinationViewController),并使用它来隐藏底栏,
-(void)prepareForSegue:(UIStoryboardSegue *) segue sender:(id) sender {
if ([segue.identifier isEqualToString:@"LogoutView"]) {
[self logOut];
LoginViewController *svc = segue.destinationViewController;
svc.hidesBottomBarWhenPushed = YES;
}
}
如果您需要有条件地执行此操作,则segue应直接从控制器连接,而不是按钮。 然后你需要调用performSegueWithIdentifier:在某种方法中你有逻辑来确定应该执行哪个(或者是否)segue。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.