问题如下:我有一个带有导航栏的iOS 9应用程序(Swift),其中包含一堆UIBarButtonItems,这些UIBarButtonItems与几个UINavigationControllers相连,最终将表格,视图等显示为弹出窗口。当然,点击这些按钮之一不会自动禁用导航栏中的其他UIBarButtonItems,用户可以自由点击它们。但是,在已经显示弹出窗口的情况下,我们会收到以下警告,因为这是对HIG的反对,也是拒绝的理由:

Attempt to present UINavigationControllerViewController which is already presenting (null)


要在弹出窗口显示后解决此问题,请执行以下操作:a)需要禁用其余的UIBarButtonItems,并且b)必须停止显示其他弹出窗口。

xcode - 在导航栏中禁用UIBarButtonItems并停止辅助填充器-LMLPHP

那么,在这里采取行动的最佳原因是什么?弹出窗口的视图控制器的isBeingPresented标志在管理视图控制器中不可用,因为一个人不能在另一个视图控制器中创建一个视图控制器的出口,并且navigationController的viewControllers数组不包括外部导航控制器或其后代。

我的la脚解决方法涉及一个全局appIsPresentingPopover Bool,在提到的视图控制器中,在viewDidLoad中将其设置为true,在viewDidDisappear中将其设置为false。然后在管理视图控制器的prepareForSegue方法中测试该Bool,以停止显示其他弹出窗口。还可以禁用所有已具有插座的已启用的UIBarButtonItem。丑陋!

处理这种常见情况的标准方法是什么?

最佳答案

出乎意料的简单解决方案,比我最初尝试的要优雅得多。我为所有涉及的弹出窗口和一个UIViewController类变量添加了segue标识符。在prepareForSegue中,将变量设置为目标视图控制器。然后,在shouldPerformSegueWithIdentifier中,我只是检查该popover变量是否为nil。如果不是,则关闭UIViewController并将其设置为nil。最后,我还遵循了Beau Nouvelle的建议,并使这些按钮保持点亮状态,以便用户可以在弹出菜单之间直接切换。再次感谢。

10-08 05:23