从弹出视图中呈现视图

4

在我的应用程序中,用户可以按下一个表格视图单元格,这将显示一个带有按钮的弹出窗口。按下此按钮将呈现一个导航视图控制器。

DNWInfoViewController *infoViewController = [[DNWInfoViewController alloc] initWithInfoText:infoText];
    UINavigationController *navController    = [[UINavigationController alloc] initWithRootViewController:infoViewController];
    navController.modalPresentationStyle     = UIModalPresentationFormSheet;
    [self presentViewController:navController animated:YES completion:nil];

但是自从iOS 8以后,我收到了这个警告,视图没有显示出来:

Warning: Attempt to present <UINavigationController: 0x180e1dc0>  on <ANProjectFilterViewController: 0x16ec5cf0> which is already presenting (null)

这可能是因为弹出控制器还在显示,所以在呈现视图之前我尝试了这个。
[_ppvrController dismissPopoverAnimated:YES]; // This will not call the delegate

这种“修复”方法有时候有效,但大多数情况下仍然会显示警告而不是我的视图。我尝试手动调用代理,但结果相同。

这在iOS 7及以下版本中曾经很好用。如何在iOS 8中从弹出窗口呈现新视图?

编辑1

我发现

dismissPopoverAnimated

由于某些原因,在iOS 8中无法正常工作。通常,当用户从弹出窗口中选择一个项目时,会调用一个方法,该方法首先关闭弹出窗口,然后执行一些自定义操作。在iOS 7中,选择后弹出窗口会消失,但在iOS 8中不会消失。 编辑2 实际上触发警告的是这段代码:
[_ppvrController dismissPopoverAnimated:YES];

这段代码位于一个方法内部。该方法从一个放置在弹出式窗口中的按钮中调用。有一半的时间,弹出式窗口可以成功地消失,但有时它只会打印警告并保持可见。

注意:此方法内没有其他代码。只有一行代码用于关闭弹出式窗口。

2个回答

6

这似乎是iOS 8上的一个bug。我建议你向苹果公司报告此问题。同时,我了解到其他人正在使用以下解决方法:

[[NSOperationQueue mainQueue] addOperationWithBlock:^{
    [self presentViewController:yourNewNavigationController animated:YES completion:nil];
}];

1
不幸的是,这给了我同样的警告。苹果在发布说明中有关于此事的声明吗?我不明白为什么在旧版iOS中这个功能可以正常工作。 - Mark Molina
我发现在iOS 8中,dismissPopoverAnimated无法正常工作。 - Mark Molina
看起来是相同的行为。有时它可以工作,有时它会显示警告。我会报告这个错误并接受答案,因为目前还没有解决方法。 - Mark Molina
1
你可以尝试在任意延迟后调用它,例如:double delayInSeconds = 0.01; dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC); dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ [self presentViewController:yourNewNavigationController animated:YES completion:nil]; }); - Ricardo Sanchez-Saez
不好意思,还是不行。延迟后警告框仍然弹出。请查看我在问题中添加的另一项发现。 - Mark Molina
我想知道他们是如何在自己的SDK中实现的,例如UIActivityController可以呈现许多其他控制器。 - yasirmturk

1

只需将presentViewController移动到自己的方法中,并使用performSelectorOnMainThread调用该方法

那应该可以工作了


我尝试了ricardo的答案,结果显示相同的行为。这看起来像是iOS 8中的一个bug。 - Mark Molina

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接