UIBarButtonItem + popover segue创建了多个弹出窗口

时间:2011-12-22 01:43:24

标签: ipad ios5 uibarbuttonitem segue

我目前有一个带有UIToolbar的iPad应用程序,其中包含两个UIBarButtonItems,每个UIBarButtonItem都连接到一个popover segue。

当用户触摸任一UIBarButtonItem时,将创建弹出窗口而不是切换弹出窗口。这会创建多个重叠的弹出式窗口。我已经能够使用以下代码关闭以前创建的popover

- (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 ...
}

我还有UIButtons,可以创建正常行为的popover segues。由于与UIBarButtonItems关联的弹出窗口的这种行为,我的应用程序被拒绝。有人有任何UIToolbar的建议或任何代码示例,其中多个UIBarButtonItem正常工作吗?当用户触摸窗外时,弹出窗口会消失,

3 个答案:

答案 0 :(得分:16)

这是做你需要做的事情的正确方法:

- (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];
    }
}

这确保了如果已经显示了弹出窗口的实例,则将取消segue。您只需要确保您的popover对象在故事板中有一个标识符。

答案 1 :(得分:8)

当您在-prepareForSegue:sender:收到消息时,取消segue为时已晚。

为了有效地执行此操作,您应该从视图控制器本身而不是条形按钮为您的弹出窗口创建segue,以便它们仍然可以以编程方式执行。现在将UIBarButtonItem连接到一些有条件地呈现或解除弹出窗口的方法。

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

    [self performSegueWithIdentifier:@"ShowPopoverA"];
}

答案 2 :(得分:1)

两者结合使我

-(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;
}