我有一个包含多个按钮的导航栏,包括一个后退按钮、一个编辑按钮和一个打开弹出框的按钮。
当弹出框打开并且用户点击任何其他按钮时,我希望弹出框关闭。如果弹出窗口打开,我可以尝试检测所有按钮上的每次点击并拦截操作,但我认为可能有更优雅的选择。它适用于点击不在导航栏中的所有项目,只有导航栏中的按钮不会关闭弹出框。
有什么建议么?
我的问题非常类似于UIPopoverController 在单击 NavigationBar 时不会关闭,但我似乎没有办法询问作者是否解决了问题。
我有一个包含多个按钮的导航栏,包括一个后退按钮、一个编辑按钮和一个打开弹出框的按钮。
当弹出框打开并且用户点击任何其他按钮时,我希望弹出框关闭。如果弹出窗口打开,我可以尝试检测所有按钮上的每次点击并拦截操作,但我认为可能有更优雅的选择。它适用于点击不在导航栏中的所有项目,只有导航栏中的按钮不会关闭弹出框。
有什么建议么?
我的问题非常类似于UIPopoverController 在单击 NavigationBar 时不会关闭,但我似乎没有办法询问作者是否解决了问题。
我知道这可能有点晚了,但对其他人来说:
出现此问题的原因是,如果 popoverController 在单击导航栏上的按钮时出现,则导航控制器默认存在于 popoverController 的passthroughViews中。
要解决这个问题,只需将 passthroughViews 的引用设为 nil。
因此,在呈现 popoverController 之后添加这一行:
popoverController.passthroughViews = nil;
希望这可以帮助某人。
将每个按钮的选择器分配给相同的方法,首先,检查弹出框是否打开,然后关闭它,然后将每个按钮重定向到它的方法。
-(IBAction) navButtons:(UIBarButtonItem *)sender {
if(![popoverController isPopoverVisible] && sender.tag == 1){//assume that just one button will open the popover
//present the popover
} else {
//dismiss the popover
}
switch (sender.tag) {
case 1:
[self button1Handler];
break;
case 2:
[self button2Handler];
break;
/*...
...
...*/
default:
break;
}
}
我认为这是您可以使用的最佳解决方案。
导航栏上的项目将自动添加到 popoverViewController 的 passthroughViews。它发生在弹出窗口出现之后。所以你需要在那之后清除 passthroughViews 。
而对于 iOS 8,我们可以从 UIViewController.popoverPresentationController 中获取 popoverController,在此之前,我们可以从 UIStoryboardPopoverSegue 中获取 popoverController。
请参阅以下链接以获取代码示例: