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



我目前有一个iPad应用程序,它的ui工具栏包含两个uibarbuttonitem,每个都连接到一个弹出窗口segue

当用户触摸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 ...
}

我也有UIButtons创建行为正常的弹出窗口segue。由于与UIBarButtonItems关联的弹出窗口的这种行为,我的应用程序被拒绝了。有人有任何建议或任何代码样本与多个UIBarButtonItems正确工作的工具栏?当用户触摸窗外时弹出窗口会自动消失

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

- (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将被取消。你只需要确保你的弹出窗口对象在故事板中有一个标识符。

当你在-prepareForSegue:sender:中收到消息时,取消segue已经太晚了。

为了有效地做到这一点,你应该从视图控制器本身创建segue到你的弹出窗口,而不是从栏按钮,这样它们仍然可以被编程执行。现在将UIBarButtonItem连接到一些方法,这些方法将有条件地显示或取消弹出窗口。

- (IBAction)showPopoverA
{
    if (self.popoverA.popoverController.popoverVisible)
        [self.popoverA.popoverController dismissPopoverAnimated:YES];
    [self performSegueWithIdentifier:@"ShowPopoverA"];
}

两者的结合使它适合我

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

最新更新