Закройте Popover и откройте новый одним нажатием - PullRequest
4 голосов
/ 12 сентября 2011

В «Руководстве по мобильному интерфейсу человека» от Apple говорится о популярности:

Если возможно, разрешите людям закрывать один поповер и открывать новый одним касанием. Такое поведение особенно желательно, когда несколько разные кнопки на панели открывают поповер, потому что это мешает людям от необходимости делать дополнительные краны.

Единственное решение, о котором я могу подумать сейчас, - это отслеживать положение касания при отклонении поповера и проверять, было ли это положение другой кнопки. Есть ли более простой способ сделать это?

PS: я искал в stackoverflow и довольно долго гуглил перед публикацией. Извините, если об этом спрашивали раньше.

UPDATE

Думаю, я не очень хорошо объяснил. Допустим, у меня есть три кнопки. Все они открывают поповер. Мой пользователь нажимает кнопку # 1, и открывается всплывающее окно. Пока всплывающее окно открыто, пользователь нажимает кнопку # 2. Всплывающее окно отклоняется (потому что пользователь нажал за пределами всплывающего окна - поведение немодальных всплывающих окон по умолчанию), и открывается новое всплывающее окно, потому что пользователь нажал кнопку №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 голосов
/ 13 сентября 2011

Если вы используете элементы панели кнопок на панели инструментов, открытое всплывающее окно не автоматически закрывается при нажатии на другой элемент кнопки панели.В этих ситуациях вы должны закрыть видимый поповер и открыть другой за один шаг.

1 голос
/ 30 октября 2011
- (IBAction)sortAction {
[searchBarView resignFirstResponder];
[self.popoverController dismissPopoverAnimated:YES]; //clear popover

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

надежда поможет вам

0 голосов
/ 12 сентября 2011

Допустим, у вас есть 3 кнопки, и каждая открывает всплывающее окно.Вы можете использовать переменную состояния, которая отслеживает, открыто ли в данный момент всплывающее окно, и внутри каждого метода «открыть всплывающее окно» закрыть существующее (если оно открыто) перед открытием нового всплывающего окна.

...