【问题标题】:is there a way NOT to have the popover dismissed when pressing outside it?有没有办法不让弹出框在外面按下时消失?
【发布时间】:2011-07-25 13:07:40
【问题描述】:

我知道 SDK 文档说

点击弹出框内容之外的内容会自动关闭弹出框。

但我相信这里的聪明人找到了办法:) 也许我应该覆盖弹出框关闭功能?

谢谢

编辑: 我尝试按照此处的建议使用 passthroughViews,并且效果很好。这是任何需要它的人的代码 - 在此示例中,我将 self.view 放入数组中,这意味着无论在哪里出现弹出框的按钮之外,都不会关闭弹出框。

        popoverController.passthroughViews = [[[NSArray alloc] initWithObjects:self.view, nil] autorelease];

【问题讨论】:

    标签: iphone sdk dismiss popover


    【解决方案1】:

    您需要设置passthroughViews 属性。来自文档:

    当弹出框可见时用户可以与之交互的一组视图。

    @property (nonatomic, copy) NSArray *passthroughViews

    当弹出框处于活动状态时,与其他视图的交互通常会被禁用,直到弹出框被关闭。将视图数组分配给此属性允许弹出框外部的点击由相应的视图处理。

    passthroughViews 设置为要处理触摸事件而不是仅仅关闭弹出框的视图数组。

    【讨论】:

    • 谢谢!我马上去试试。我很惭愧我自己在代码中找不到它,但这就是我们有stackoverflow的原因,对吧? :) 你有关于如何设置这些视图的示例/参考示例吗?
    【解决方案2】:

    有一个非常简单且合法的解决方案。在呈现您的UIPopoverController 的视图控制器中,遵守UIPopoverControllerDelegate 协议并实现以下委托方法。我刚刚对此进行了测试,它确实可以防止弹出框关闭。

    - (BOOL)popoverControllerShouldDismissPopover:(UIPopoverController *)popoverController
    {
        return NO;
    }
    

    只需确保您已将弹出框控制器的委托设置为实现此功能的视图控制器。

    您可以使用[popoverController dismissPopoverAnimated:NO]; 方法关闭弹出框。

    【讨论】:

      【解决方案3】:

      接受的答案并没有真正回答这个问题,“有没有办法在按下弹出框时不让弹出框消失?”,imo。它确实提供了一个可能的视图,但可能需要对所有父视图进行黑客访问并确定屏幕上的视图等。问题可以改写为“如何制作弹出视图模式?”

      您可以这样做,使用完成按钮关闭弹出框:

      UIViewController* vc = [[[UIViewController alloc] init] autorelease];
      
      UIBarButtonItem* doneButton = [[[UIBarButtonItem alloc] initWithTitle:@"Done"] style:UIBarButtonItemStyleDone target:self action:@selector(processDoneAction)] autorelease];
      
      [vc.navigationItem setLeftBarButtonItem:doneButton];
      
      vc.modalInPopover = YES;
      //If you want full screen:
      vc.modalPresentationStyle = UIModalPresentationFullScreen;
      vc.wantsFullScreenLayout = YES;
      
      UINavigationController* navC = [[[UINavigationController alloc] initWithRootViewController:vc] autorelease];
      
      UIView* view = create your view
      
      vc.view = view;
      
      UIPopoverController* pc = [[[UIPopoverController alloc] initWithContentViewController:navC] autorelease];
      pc.delegate = self;
      self.popoverController = pc;
      

      然后您将在您的 processDoneAction 方法中关闭弹出框。其他考虑因素是在设备方向更改时关闭和重新显示,但我将把它留给另一个练习,因为之前在 stackoverflow 上已经回答了这个问题。

      【讨论】:

        猜你喜欢
        • 2020-02-18
        • 1970-01-01
        • 2012-11-09
        • 2012-06-10
        • 2019-12-05
        • 2019-10-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多