【问题标题】:Don't connect segue when alertview shows当 alertview 显示时不要连接 segue
【发布时间】:2023-04-06 22:11:01
【问题描述】:

我在情节提要中连接了一个 push segue,然后我使用 prepareForSegue 方法,如下所示:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([[segue identifier] isEqualToString:@"start"] && self.name.textField.text == nil)
    {


        UIAlertView *message = [[UIAlertView alloc] initWithTitle:@"Test"
                                                          message:@"Test
                                                         delegate:self
                                                cancelButtonTitle:@"OK"
                                                otherButtonTitles:nil];
        [message show];

    }
}

我想要做的是,如果“if”为真,则会弹出一个警报框并执行转场,但我只想显示警报框,而我不想执行转场。我该如何解决这个问题?

【问题讨论】:

    标签: iphone ios objective-c


    【解决方案1】:

    prepareForSegue:sender: 在 segue 即将执行时被调用。此时您无法取消它。

    如果您希望能够取消 segue,您应该覆盖的方法是 shouldPerformSegueWithIdentifier:sender:

    【讨论】:

    • 这里不能显示alertview,因为该方法会在用户选择一个选项之前返回。您需要在调用 segue 之前显示和处理 alertview。
    • 是的,该方法将在用户选择选项之前返回。为什么你认为这是个问题?
    • 因为@nonuma希望返回值是由用户的选择决定的,当方法返回时将不可用。
    • @Jim 谢谢,这行得通,但是如果我点击它,alertview 会显示,但按钮仍然突出显示,我该如何关闭它?
    • @nonuma,我不太明白你在说什么。无论如何,这是一个单独的问题,因此请将其作为一个新问题发布,并提供更多详细信息。
    【解决方案2】:

    我认为你需要在这里重新评估你的逻辑并从prepareForSegue中删除条件

    使用UIAlertDelegate

    - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
        NSString *title = [alertView buttonTitleAtIndex:buttonIndex];
        if([title isEqualToString:@"OK"]) {
          [self performSegueWithIdentifier:@"My Segue" sender:self];
          return;
        } // else do not perform segue
    }
    

    【讨论】:

      【解决方案3】:

      我认为你不能在这一点上停下来。

      但是你可以使用 - (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender 来自 iOS 6。

      【讨论】:

      • @AaronBrager 您可以在此处检查您的条件以返回 false。你也可以调用一个方法来显示警报。
      • @AaronBrager 快速搜索导致此(stackoverflow.com/questions/9407571/…) 详细帖子。
      • @AaronBrager,如果必须根据用户选择来决定 segue,您是正确的。但我认为他不需要它。
      【解决方案4】:

      尝试为您的 segue 指定一个不同的名称,并且仅在未显示警报时才调用该 segue(例如“[self performSegueWithIdentifier: @"MyRealStartSegue" sender: sender]”)。

      当然,这意味着您需要在“prepareForSegue”方法的外部检查这些条件。按下某个按钮时可能是 IBAction?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-16
        • 1970-01-01
        • 1970-01-01
        • 2019-11-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多