UINavigationController:在iPad上正在解除另一个控制器时呈现视图控制器

时间:2013-11-08 10:53:16

标签: ios objective-c ipad uinavigationcontroller modalviewcontroller

我有一个需要用户登录的视图。当用户尝试打开该视图时他没有登录我将调用登录视图供他登录,完成后我将调用原始视图他打算看到。
在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上的作用 - 而不是呈现控制器,它使用推动,在这种情况下一切正常。

2 个答案:

答案 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更改模式登录对话框之前的导航控制器堆栈,然后再解除模式