8

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

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

- (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 可以创建行为正常的弹出框。由于与 UIBarButtonItems 关联的弹出框的这种行为,我的应用程序被拒绝。是否有人对具有多个正常工作的 UIBarButtonItems 的 UIToolbar 有任何建议或任何代码示例?当用户在窗口外触摸时,弹出框会消失,

4

3 回答 3

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。您只需要确保您的弹出框对象在情节提要中有一个标识符。

于 2012-12-17T21:28:06.747 回答
8

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

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

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

    [self performSegueWithIdentifier:@"ShowPopoverA"];
}
于 2011-12-22T02:18:42.630 回答
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;
}
于 2013-08-09T15:56:25.640 回答