关闭弹出窗口并通过一次轻触打开新的弹出窗口。

4

苹果公司的“移动人机界面指导方针”关于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
3个回答

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

我没有使用工具栏,而是一堆UIButtons。那么它就是一样的吗?那将会很奇怪。我的弹出窗口表现不同。 - strave
是的,它的行为不同。如果您不使用工具栏,则不会遇到这个问题。您可以轻松尝试一下,将两个UIBarButtonItems放在工具栏中,两者都打开一个弹出窗口。如果您按第二个按钮,则第一个弹出窗口不会关闭(尽管点击在第一个弹出窗口之外)。在这些情况下,您必须自己管理弹出窗口。 - Tom
但是由于我没有使用工具栏,所以我没有那个“问题”。虽然如此,我很乐意遇到这个问题。在那种情况下,我可以关闭弹出窗口并打开一个新的。在我的情况下,当弹出窗口打开时,似乎无法获取任何按钮的触摸事件。您可以检查我刚刚发布的代码。 - strave
6
UIPopoverController有一个名为passthroughViews的属性。你可以在那里注册你的按钮,并获取事件。只需查看文档即可。 - Tom
我已经阅读了文档,但似乎我忽略了那个属性。那正是我正在寻找的。非常感谢! - strave

1
- (IBAction)sortAction {
[searchBarView resignFirstResponder];
[self.popoverController dismissPopoverAnimated:YES]; //clear popover

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

希望能对你有所帮助


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

我想我没有解释清楚。假设我有三个按钮,它们都会打开一个弹出窗口。我的用户点击按钮1,弹出一个弹出窗口。当弹出窗口打开时,用户点击按钮2。弹出窗口被关闭(因为用户在弹出窗口外面点击 - 非模态弹出窗口的默认行为),然后新的弹出窗口打开,因为用户已经点击了按钮2。所有这些都不需要点击两次:一次用于关闭弹出窗口,两次用于打开新的弹出窗口。 - strave
我不想使用模态弹出框。我认为如果用户不必点击两次才能打开新的弹出框,那会更好看。 - strave
他们不需要点击两次。单击按钮将关闭现有的打开模态框(如果有打开的),然后打开新的模态框。只需编写方法来执行这两个操作。 - cpjolicoeur
那么我的代码肯定有问题。如果我打开了一个模态弹出窗口,当点击按钮时,打开弹出窗口的方法不会被调用。这就是为什么我认为当弹出窗口打开时,点击事件没有被注册。也许我应该建立一个小的虚拟测试来验证一下... - strave
我建立了一个虚拟对象,但是我遇到了同样的问题:当弹出窗口打开时,打开弹出窗口的方法没有被调用。我将发布代码。 - strave

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