我有一个需要用户登录的视图。当用户尝试打开该视图时他没有登录我将调用登录视图供他登录,完成后我将调用原始视图他打算看到。
在iPhone上,当我在那里推动视图控制器时这很好。
但在我提供视图控制器的iPad上,这不起作用。它说解雇正在进行中,无法显示新的控制器。这是代码:
- (void) buttonPressed
{
if (!userLoggedIn) { // userLoggedIn getter calls new screens of login if needed
return; // this is executed if user declined to login
}
MyViewController *temp = [[MyViewController alloc] init];
[self.navigationController presentViewController:temp animated:YES]; // this returns warning that dismissal in progress and does not work
}
我该怎么办?在iPhone上我的所有逻辑工作正常,但在iPad上它失败了。我在很多地方使用它,完全重写代码并不好。
编辑:更多代码:
- (BOOL) userLoggedIn {
// code omitted
[centerController presentViewController:navController animated:YES completion:nil];
// code omitted
[centerController dismissViewController:navController animated:YES]; // setting to NO does not fix my problem
return YES;
}
EDIT2: 这是iPad的代码。我删除了与iPhone相关的代码。它在iPhone上的作用 - 而不是呈现控制器,它使用推动,在这种情况下一切正常。
答案 0 :(得分:3)
只要解除您的第一个视图未完成,您就无法呈现其他视图。解雇视图的动画应在呈现新视图之前完成。因此,您可以在解散或使用时将其动画设置为NO
performSelector:withObject:afterDelay:
并在2-3秒后显示下一个视图。
希望这有帮助。
答案 1 :(得分:2)
你还没有发布足够的代码来真正看到你正在做的事情,但解决和推动视图控制器冲突问题的一种方法就是将pop + posh变成一个单一的原子操作操作,而不是seqential操作。
您可以使用setViewControllers:animated:
上的UINavigationController
方法执行此操作。这允许您有效地删除一个或多个视图控制器,并添加一个或多个视图控制器,所有视图控制器都作为一个连贯的操作,具有一个无缝动画。
这是一个简单的例子:
[self.navigationController pushViewController:loginController];
// ... later on, when user login is validated:
NSMutableArray *viewControllers =
[self.navigationController.viewControllers copy];
[viewControllers removeLastObject];
[viewControllers addObject:[[MyNewViewController alloc] init]];
[self.navigationController setViewControllers:viewControllers animated:YES];
如果你这样做,你的代码将更加可预测,并且可以在iPhone和iPad上运行。
有关详细信息,请参阅API docs。
<强>更新强>
由于您的问题涉及到顶部的模态对话框,请尝试使用setViewControllers:animated:NO
更改模式登录对话框之前的导航控制器堆栈,然后再解除模式。