在导航栏中禁用 UIBarButtonItems 并停止辅助弹出窗口

Disabling UIBarButtonItems in Nav Bar and Stopping Secondary Popvers

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

Attempt to present UINavigationControllerViewController which is already presenting (null)

要在弹出窗口显示后解决此问题,a) 需要禁用剩余的 UIBarButtonItems 和 b) 需要停止显示其他弹出窗口。

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

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

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

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