【问题标题】:UINavigationController: presenting view controller while dismissing another controller is in progress on iPadUINavigationController:在 iPad 上正在关闭另一个控制器时呈现视图控制器
【发布时间】:2013-11-20 08:35:05
【问题描述】:

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

【问题讨论】:

  • 我认为您使用了两个 xib 一个用于 ipad 或一个用于 iphone 是否正确
  • 更多代码会很有用,以便查看推送的内容和时间。
  • 你已经用 modalviewcontroller 标记了这个。这里实际上涉及模态,还是只是使用了 UINavigationController?
  • 查看您的额外代码(谢谢),我认为我发布的答案正是您所需要的。
  • @occulus presentViewController 是一种以模态方式呈现视图控制器的方法。 presentModalViewController 已被弃用,而是使用这个。

标签: ios objective-c ipad uinavigationcontroller modalviewcontroller


【解决方案1】:

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

希望这会有所帮助。

【讨论】:

  • 使用 performSelector:withObject:afterDelay: 因为这种使用是在应用中引入竞争条件,也不是理想的用户体验。
  • 也许更好:在关闭选择器中使用完成块 [self dismissViewControllerAnimated:YES completion:^{.....}];呈现另一个控制器。
【解决方案2】:

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

您可以通过在UINavigationController 上使用setViewControllers:animated: 方法来做到这一点。这使您可以有效地移除一个或多个视图控制器,并添加一个或多个视图控制器,所有这些都作为一个内聚操作,具有一个无缝动画。

这是一个简单的例子:

[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 更改模式登录对话框下方的导航控制器堆栈关闭模式之前。

【讨论】:

  • 很遗憾,由于设计问题,我无法在 iPad 上推送控制器。我需要将登录控制器作为模态,然后我需要将其关闭并将新控制器也作为模态。
  • 您是否尝试过设置更改导航控制器堆栈underneath您的模态,没有动画,然后关闭模态?使用例如setViewControllers:animated:NO.
猜你喜欢
  • 2017-02-03
  • 2016-11-20
  • 2014-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-24
相关资源
最近更新 更多