在Nav Bar中禁用UIBarButtonItem并停止辅助Popvers

时间:2016-07-01 00:49:36

标签: xcode swift uinavigationbar uibarbuttonitem popover

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

Attempt to present UINavigationControllerViewController which is already presenting (null)

要在弹出窗口显示时处理问题a)需要禁用剩余的UIBarButtonItems,并且b)需要暂停显示其他弹出窗口。

button A is still enabled

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

我的蹩脚解决方法涉及全局appIsPresentingPopover Bool,在viewDidLoad中设置为true,在上述视图控制器中设置为viewDidDisappear中的false。然后在管理视图控制器的prepareForSegue方法中测试Bool以阻止显示其他弹出窗口。它也是kvo'ed来禁用任何已启用的UIBarButtonItems,它们现在都有一个插座。难看!

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

1 个答案:

答案 0 :(得分:0)

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