2011-03-29 32 views
8

我知道SDK文档说有没有办法在外面按下弹出式窗口来解除弹出窗口?

弹出窗口的内容之外自动关闭弹出窗口。

但我敢肯定聪明的人在这里找到了一种方法:) 也许我应该覆盖popover dismiss函数?

感谢

编辑: 我尝试使用passthroughViews因为在这里建议,和它完美的作品。这里是谁需要它的代码 - 在这个例子中,我把self.view放在数组中,这意味着在弹出窗口起源的按钮之外的地方,没有任何东西不关闭popover。

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

回答

11

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

用户可以在弹出窗口可见时进行交互的视图数组。

@property (nonatomic, copy) NSArray *passthroughViews

当酥料饼是活动的,与其他的观点的相互作用通常禁用,直到酥料饼被驳回。为该属性分配一个视图数组允许在相应的视图中处理弹出窗口以外的窗口。

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

+0

谢谢!我会马上尝试。我很惭愧,我无法在代码中找到它自己,但这就是为什么我们有了stackoverflow,对吧?:)你有关于如何设置这些视图的例子/参考例子吗? – 2011-03-30 07:39:29

6

接受的答案并没有真正回答这个问题,“有没有办法在外面按下弹出窗口时被解雇?”,imo。它确实提供了一个可能的视图,但可能需要对所有父视图进行黑客访问并确定屏幕上的视图等。这个问题可以被重新设置为“我如何制作popover视图模式?”

你会做到这一点像这样,以完成按钮来关闭酥料饼:

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上回答的。

7

有一个非常简单和合法的解决方案。在呈现您的UIPopoverController的视图控制器中,遵循UIPopoverControllerDelegate协议并实施以下委托方法。我只是测试了这一点,它确实防止popover被解雇。

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

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

您可以使用[popoverController dismissPopoverAnimated:NO];方法解除弹出窗口。