Apple 的“移动人机界面指南”谈到 Popovers:
如果可能,允许人们一键关闭一个弹出框并打开一个新弹出框。当几个不同的条形按钮都打开一个弹出框时,这种行为尤其可取,因为它可以防止人们不得不进行额外的点击。
我现在能想到的唯一解决方案是在关闭弹出框时跟踪触摸的位置,并检查这是否是另一个按钮的位置。有没有更简单的方法来做到这一点?
PS:我在stackoverflow中搜索并在发布前搜索了一段时间。抱歉,如果以前在这里问过这个问题。
更新
我想我没有很好地解释自己。假设我有三个按钮。他们都打开了一个弹出窗口。我的用户点击按钮 #1 并打开一个弹出窗口。当弹出框打开时,用户点击按钮#2。弹出框被关闭(因为用户在弹出框之外点击 - 非模态弹出框的默认行为)并且由于用户单击按钮#2而打开了一个新的弹出框。所有这些都无需点击两次:一次关闭弹出框,两次打开新弹出框。
第二次更新
我建立了一个简单的假人来重现我正在尝试做的事情。当用户点击按钮并打开弹出框时,不会调用打开弹出框的方法。因此,用户必须单击两次才能打开第二个弹出框。有任何想法吗?
#import "RootViewController.h"
#import "AViewController.h"
@interface RootViewController()
@property (nonatomic, retain) UIPopoverController *currentPopover;
@end
@implementation RootViewController
@synthesize currentPopover;
- (void)loadView
{
CGRect applicationFrame = [[UIScreen mainScreen] applicationFrame];
UIView *view = [[UIView alloc] initWithFrame:applicationFrame];
CGRect buttonFrame = CGRectMake(50, 100, 200, 40);
for (int i = 0; i < 3; i++)
{
UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[button setTitle:[NSString stringWithFormat:@"Button %i", i + 1] forState:UIControlStateNormal];
[button addTarget:self action:@selector(openPopover:) forControlEvents:UIControlEventTouchDown];
[button setFrame:buttonFrame];
[view addSubview:button];
buttonFrame.origin.y += 50;
}
self.view = view;
[view release];
}
- (IBAction)openPopover:(id)sender
{
AViewController *avc = [[AViewController alloc] init];
UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:avc];
[avc release];
UIPopoverController *tempPopover = [[UIPopoverController alloc] initWithContentViewController:navigationController];
[tempPopover setDelegate:self];
[tempPopover setPopoverContentSize:CGSizeMake(320, 500)];
[tempPopover presentPopoverFromRect:[sender frame] inView:[self view] permittedArrowDirections:UIPopoverArrowDirectionLeft animated:YES];
self.currentPopover = tempPopover;
[tempPopover release];
[navigationController release];
}
- (void)dealloc
{
[currentPopover release];
[super dealloc];
}
@end