我有一个导航栏,其中包含多个按钮,包括后退按钮,编辑按钮和打开弹出窗口的按钮。
当弹出窗口打开并且用户点击任何其他按钮时,我希望弹出窗口关闭。我可以尝试检测所有按钮上的每个按钮,并在弹出窗口打开时拦截动作,但我可能会有更优雅的选项。它适用于所有不在导航栏内的项目,只有导航栏中的按钮不会忽略弹出框。
有什么建议吗?
我的问题与UIPopoverController does not dismiss when clicking on the NavigationBar非常相似,但我似乎无法询问作者是否解决了问题。
答案 0 :(得分:9)
我知道这可能有点晚了,但对其他人来说:
出现此问题的原因是,如果在导航栏上单击按钮时显示popoverController,则导航控制器默认存在于popoverController的passthroughViews中。
要解决此问题,只需将passthroughViews的引用设为nil。
只需在呈现popoverController后添加以下行:
popoverController.passthroughViews = nil;
希望这有助于某人。
答案 1 :(得分:2)
将每个按钮的选择器分配给相同的方法,首先,检查弹出窗口是否打开,然后关闭它然后将每个按钮重定向到它的方法。
-(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;
}
}
我认为这是您可以使用的最佳解决方案。
答案 2 :(得分:0)
对于iOS 8,我们可以从UIViewController.popoverPresentationController获取popoverController,在此之前,我们可以从UIStoryboardPopoverSegue获取popoverController。
请参阅以下链接以获取代码示例: