3

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

4

2 回答 2

3

只要您的第一个视图的关闭尚未完成,您就不能呈现另一个视图。关闭视图的动画应该在呈现新视图之前完成。因此,您可以在关闭时将其动画设置为NO,或者在 2-3 秒后使用 performSelector:withObject:afterDelay: 并呈现下一个视图。

希望这可以帮助。

于 2013-11-08T11:27:22.537 回答
2

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

您可以通过使用setViewControllers:animated:on 方法来做到这一点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 文档

更新

由于您的问题涉及顶部的模式对话框,因此请在关闭模式之前setViewControllers:animated:NO尝试使用更改模式登录对话框下方的导航控制器堆栈。

于 2013-11-08T10:58:21.033 回答