iPad:点击导航栏中的按钮时关闭弹出窗口

时间:2012-10-07 19:59:18

标签: ios ipad uipopovercontroller popover

我有一个导航栏,其中包含多个按钮,包括后退按钮,编辑按钮和打开弹出窗口的按钮。

当弹出窗口打开并且用户点击任何其他按钮时,我希望弹出窗口关闭。我可以尝试检测所有按钮上的每个按钮,并在弹出窗口打开时拦截动作,但我可能会有更优雅的选项。它适用于所有不在导航栏内的项目,只有导航栏中的按钮不会忽略弹出框。

有什么建议吗?

我的问题与UIPopoverController does not dismiss when clicking on the NavigationBar非常相似,但我似乎无法询问作者是否解决了问题。

3 个答案:

答案 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)

导航栏上的文本将自动添加到popoverViewController的passthroughViews中。它出现在弹出窗口后。所以你需要在那之后清除passthroughViews。

对于iOS 8,我们可以从UIViewController.popoverPresentationController获取popoverController,在此之前,我们可以从UIStoryboardPopoverSegue获取popoverController。

请参阅以下链接以获取代码示例:

https://stackoverflow.com/a/27054252/2919070