UIBarButtonItem + popover segue создает несколько всплывающих окон - PullRequest
8 голосов
/ 22 декабря 2011

В настоящее время у меня есть приложение для iPad с панелью UIToolbar, содержащей два UIBarButtonItems, каждый из которых подключен к переходу поповера.

Когда пользователь касается любого из UIBarButtonItems, всплывающее окно создается, а не переключается,Это создает несколько перекрывающихся всплывающих окон.Я смог закрыть ранее созданный поповер, используя следующий код

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    // First close the preferences popover if it's open per Apple guidelines
    if ([self.popoverA.popoverController isPopoverVisible]) {
        [self.popoverA.popoverController dismissPopoverAnimated:YES];
    }

    if ([self.popoverB.popoverController isPopoverVisible]) {
        [self.popoverB.popoverController dismissPopoverAnimated:YES];
    }
    ... code to manage segues ...
}

. У меня также есть кнопки UIB, которые создают сегменты поповера, которые ведут себя нормально.Из-за этого поведения всплывающих окон, связанных с UIBarButtonItems, мое приложение отклоняется.Есть ли у кого-нибудь какие-либо предложения или примеры кода UIToolbar с несколькими UIBarButtonItems, которые работают правильно?Всплывающие окна отклоняются, когда пользователь касается окна,

Ответы [ 3 ]

16 голосов
/ 18 декабря 2012

Это правильный способ сделать то, что вам нужно сделать:

- (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender {
    if ([identifier isEqualToString:@"SurveyListPopover"]) {
        if (self.surveyListPopover == nil) {
            return YES;
        }
        return NO;
    }
    return YES;
}

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([segue.identifier isEqualToString:@"SurveyListPopover"]) {
        // Assign popover instance so we can dismiss it later
        self.surveyListPopover = [(UIStoryboardPopoverSegue *)segue popoverController];
    }
}

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

8 голосов
/ 22 декабря 2011

К тому времени, когда вы получите сообщение в -prepareForSegue:sender:, уже слишком поздно отменять переход.

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

- (IBAction)showPopoverA
{
    if (self.popoverA.popoverController.popoverVisible)
        [self.popoverA.popoverController dismissPopoverAnimated:YES];

    [self performSegueWithIdentifier:@"ShowPopoverA"];
}
1 голос
/ 09 августа 2013

Сочетание обоих сделало это для меня

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.identifier isEqualToString:@"showPopover"]) {
        self.tableOfContentsPopoverController = [(UIStoryboardPopoverSegue*)segue popoverController];
    }
}

- (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender {
    if ([identifier isEqualToString:@"showPopover"]) {
        if (!self.tableOfContentsPopoverController.popoverVisible) {
            return YES;
        }
        return NO;
    }
    return YES;
}
...