4

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
4

3 回答 3

2

如果您在工具栏中使用条形按钮项,则当您点击另一个条形按钮项时,打开的弹出框不会自动关闭。在这些情况下,您应该关闭可见的弹出框并一步打开另一个。

于 2011-09-12T21:22:52.073 回答
1
- (IBAction)sortAction {
[searchBarView resignFirstResponder];
[self.popoverController dismissPopoverAnimated:YES]; //clear popover

self.popoverController = popoverSetting;
[self.popoverController presentPopoverFromBarButtonItem:sortBarButtonItem
                               permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES]; //show popover
}

希望能帮到你

于 2011-10-30T08:05:02.573 回答
0

假设您有 3 个按钮,每个按钮都会打开一个弹出窗口。您可以使用状态变量来跟踪弹出窗口当前是否打开,并在每个“打开弹出窗口”方法中,在打开新弹出窗口之前关闭现有的(如果它是打开的)。

于 2011-09-12T16:03:38.637 回答