【问题标题】:UIBarButtonItem + popover segue creates multiple popoversUIBarButtonItem + popover segue 创建多个弹出框
【发布时间】:2011-12-22 01:43:23
【问题描述】:

我目前有一个 iPad 应用程序,其 UIToolbar 包含两个 UIBarButtonItems,每个都连接到一个弹出框。

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

【问题讨论】:

  • 只是为了澄清我的问题。预期的行为是每次触摸按钮 (UIBarButtonItem) 时,弹出框应切换为打开或关闭,而不是始终打开。然而,segue 似乎总是创建另一个弹出框,而不是消除现有的可见弹出框。当链接到 UIButton 时,弹出框会适当地切换。

标签: ipad ios5 uibarbuttonitem segue


【解决方案1】:

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

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

【讨论】:

【解决方案2】:

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

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

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

    [self performSegueWithIdentifier:@"ShowPopoverA"];
}

【讨论】:

  • 感谢您的提示,我会尝试的!
  • 在尝试该建议后,我收到以下错误:由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“UIStoryboardPopoverSegue 必须从条形按钮项或视图呈现。
  • - (IBAction)showPopoverA:(id)sender { if ([self.popoverA.popoverController isPopoverVisible]) { [self.popoverA.popoverController dismissPopoverAnimated:YES]; } [self performSegueWithIdentifier:@"showPopoverASegue" sender:sender]; }
  • - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { if ([[segue identifier] isEqualToString:@"showPopoverASegue"]) { UINavigationController *navController = [(UIStoryboardPopoverSegue *)segue destinationViewController]; PreferencesVC *dvc = [[navController viewControllers] objectAtIndex:0]; [dvc setUserPrefs:self.userPrefs]; [dvc setDelegate:self]; // used to close popover [self setPrefsPopover:(UIStoryboardPopoverSegue *)segue]; [self.prefsPopover.popoverController setDelegate:self]; }
  • 抱歉没有回车。似乎无法将我的 cmets 格式化为更具可读性。
【解决方案3】:

两者的结合使我受益匪浅

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-26
    • 1970-01-01
    • 2022-11-10
    • 1970-01-01
    • 2014-05-25
    • 2012-01-15
    • 1970-01-01
    相关资源
    最近更新 更多