按在弹出框外部时,有没有不关闭弹出框的方法?

9
我知道SDK文档上说:
点击弹出窗口内容以外的区域会自动关闭弹出窗口。
但我相信这里聪明的人们一定有办法 :) 也许我应该重写弹出窗口关闭函数?
谢谢!
编辑: 我尝试使用passthroughViews,正如在这里建议的那样,它完美地解决了问题。以下是代码,供需要的人使用 - 在这个例子中,我将self.view放入数组中,这意味着无论在哪个按钮之外的地方,都不会关闭弹出窗口。
        popoverController.passthroughViews = [[[NSArray alloc] initWithObjects:self.view, nil] autorelease];
3个回答

13
您需要设置 passthroughViews 属性。根据文档说明:

一个用户可以与弹出窗口同时交互的视图数组。

@property (nonatomic, copy) NSArray *passthroughViews

当弹出窗口激活时,通常禁用与其他视图的交互,直到弹出窗口关闭。将一组视图分配给此属性允许处理弹出窗口外部的点按相应的视图。

passthroughViews 设置为您希望处理触摸事件的视图数组,而不仅仅是关闭弹出窗口。

谢谢!我会立刻尝试。我很惭愧自己在代码中找不到它,但这就是为什么我们有stackoverflow,对吧? :) 你有设置这些视图的示例/参考示例吗? - Lior Frenkel

10

有一个非常简单和合法的解决方案。在呈现您的UIPopoverController的视图控制器中,符合UIPopoverControllerDelegate协议并实现以下委托方法即可。我刚刚测试了一下,它确实可以防止弹出式窗口关闭。

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

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

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


7
被接受的答案并没有真正回答问题:“是否有一种方法在单击弹出窗口之外时不关闭它?”。它确实给出了可能的观点,但可能需要对所有父视图进行黑客式访问并确定屏幕上有哪些视图等。问题可以重新表述为“如何使弹出视图模态?”您可以通过以下方式完成此操作,添加一个“完成”按钮来关闭弹出窗口:
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上得到了回答。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接