有没有办法在窗外时不忽视popover?
题
我知道SDK文档说
POTS在POPOVER的内容之外自动解雇POPOVER。
但我相信这里的聪明人找到了一种方式:) 也许我应该覆盖popover dismiss函数?
感谢
编辑: 我尝试使用PassthroughViews,如此在此建议,它完美地工作。这是谁需要它的代码 - 在这个例子中,我把self.viewvievive在数组中,这意味着在弹出窗玻片源自开发的按钮之外,没有什么可以解除一个问题。
.popoverController.passthroughViews = [[[NSArray alloc] initWithObjects:self.view, nil] autorelease];
解决方案
您需要设置passthroughViews
属性。从文档中:
用户可以在POLPOVER可见的同时交互的视图数组。
@property (nonatomic, copy) NSArray *passthroughViews
当一个开头处于活动状态时,通常禁用与其他视图的交互,直到POPOVER被解雇。为此属性分配一系列视图允许通过相应的视图处理POPOVER之外。
将
passthroughViews
设置为要处理触摸事件的视图数组,而不是只拒绝开口。
其他提示
所接受的答案并没有真正回答这个问题,“有没有办法在按外部拒绝它才会被解雇?”,imo。它确实提供了一个可能的视图,但可能需要黑扰访问所有父视图并确定屏幕上的视图等。问题可以被重新写作,“我如何制作一个popover视图模态?”
您会这样做,使用DONY按钮关闭POLPOVER:
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;
.
然后您将在您的processDoneacheAction方法中,您需要解除POPOVER。其他考虑因素将被驳回和重新显示设备方向变化,但我会将其留给另一个练习,因为它以前在stackoverflow上得到了回答。
有一个非常简单而合法的解决方案。在呈现您的UIPopoverController
的视图控制器中,符合UIPopoverControllerDelegate
协议并实现以下委托方法。我刚刚测试了这个,它确实可以防止弹出疏忽。
- (BOOL)popoverControllerShouldDismissPopover:(UIPopoverController *)popoverController
{
return NO;
}
.
只需确保将Popover控制器的委托设置为实现此操作的视图控制器。
您可以使用[popoverController dismissPopoverAnimated:NO];
方法忽略POLDOVER。