UINavigationController:呈现视图控制器,同时closures另一个控制器正在iPad上进行

我有一个观点,要求用户login。当用户试图打开该视图,他没有login,我会打电话给他的login视图login,他完成后,我会打电话给他原来的意见,他打算查看。
在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; } 

编辑2:这是iPad的代码。 我已经删除了iPhone相关的代码。 它在iPhone上做什么 – 而不是呈现控制器使用推送,在这种情况下,一切正常。

只要解散您的第一个视图不完整,您就不能呈现另一个视图。 在提出新观点之前,应该完成解散视图的animation。 因此,可以在解散时将其animation设置为NO ,或者使用performSelector:withObject:afterDelay:并在2-3秒后呈现下一个视图。

希望这可以帮助。

你还没有发布足够的代码来真正看到你在做什么,但是解决和推动视图控制器以这种方式发生冲突的问题的一个方法是将pop + posh变成单个primefaces操作操作,而不是seqential操作。

你可以通过在UINavigationController上使用setViewControllers:animated:方法来做到这一点。 这使您可以有效地删除一个或多个视图控制器,并添加一个或多个视图控制器,所有这些都是一个内聚的操作,只需一个无缝animation。

这是一个简单的例子:

 [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文档 。

更新

由于您的问题涉及顶部的modal dialog,请尝试使用setViewControllers:animated:NO来更改模态login对话框下方的导航控制器堆栈, 然后再解除模态。

Interesting Posts