2

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

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

有什么建议么?

我的问题非常类似于UIPopoverController 在单击 NavigationBar 时不会关闭,但我似乎没有办法询问作者是否解决了问题。

4

3 回答 3

10

我知道这可能有点晚了,但对其他人来说:

出现此问题的原因是,如果 popoverController 在单击导航栏上的按钮时出现,则导航控制器默认存在于 popoverController 的passthroughViews中。

要解决这个问题,只需将 passthroughViews 的引用设为 nil。

因此,呈现 popoverController 之后添加这一行:

popoverController.passthroughViews = nil;

希望这可以帮助某人。

于 2013-02-21T07:15:54.590 回答
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;
    }
}

我认为这是您可以使用的最佳解决方案。

于 2012-10-07T20:34:51.313 回答
0

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

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

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

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

于 2014-11-21T04:43:16.560 回答