prepareForSegue: 如何设置if条件?

5
这可能很基础,但是...
我在Storyboard中的两个ViewControllers之间设置了一个标识符为clickBtn的segue。
现在我要在我的代码中这样调用它:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([[segue identifier] isEqualToString:@"clickBtn"])
    {
        if(conditionVerified)
        {
            SecondViewController *controller = (SecondViewController *)segue.destinationViewController;
            [controller setManagedObjectContext:self.managedObjectContext];
        }
        else
        {
            // If I enter here I get the error below
        }
    }
}

由于搜索实体名称“Link”时使用了非法的NSManagedObjectContext参数nil,应用程序终止,抛出未捕获的异常NSInvalidArgumentException。

实际上,如果进入else语句,我不想进行此转换。如何做到这一点?


哪个textField?或者更好的说,文本框在哪里? - alecnash
我认为代码中存在错误,您试图创建托管对象。这是在SecondViewController的init方法中吗?请向我们展示这段代码。 - opedge
@opedge 这就是问题所在,因为我不想在进入else语句时执行这个segue。 - Rob
@alecnash 是的,我的managedObjectContext是nil,因为无论如何我都会push这个视图,但我不知道该如何避免在conditionVerified为false时执行这个segue。 - Rob
1
@Rob 我认为你应该在Storyboard中设置segue标识,然后在检查后手动执行这个segue: [self performSegueWithIdentifier:<your segue identifier> sender:nil]; - opedge
显示剩余3条评论
5个回答

16

如需选择性地禁止过渡,请实现

- (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender

根据您的条件返回YESNO。在您的示例中:

- (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender
    if ([identifier isEqualToString:@"clickBtn"])  {
        return conditionVerified;
    } else {
        return YES;
    }
}

prepareForSegue:方法中,已经“太晚”来阻止过渡。


不错的答案。但请注意,在方法的上下文中没有segue这个词。只需使用[identifier isEqualToString:@"clickBtn"]即可。 - haxpor

7
不要让按钮执行segue,而是让它调用以下方法之一。
-(IBAction)mySegueButtonMethod:(id)sender
{
   if(conditionVerified){
      [self performSegueWithIdentifier:@"clickBtn" sender:sender];
   }
   else{
        // do not perform segue and do other relevant actions.
   }
}

您看到的错误是因为我假设控制器调用了某些需要上下文管理器不为空的内容。
一旦您进入prepareForSegue方法,您无法真正阻止segue发生,因为它将在该方法结束时始终执行segue。

这并不是最好的答案。使用segues的部分原因是对于简单的事情,如按钮轻敲或表视图单元格选择,无需连接操作方法。使用shouldPerformSegueWithIdentifier:sender:的其他答案更符合此要求。 - Abizern

4
你应该针对这个目的以不同的方式重构你的代码。按照以下方式实现shouldPerformSegueWithIdentifier

以下是需要翻译的内容:

-(BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender {
    return [identifier isEqualToString:@"clickBtn"] && conditionVerified;
}

如果条件未经验证,即conditionVerified为false,则会阻止segue“clickBtn”的执行。现在使用:

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([[segue identifier] isEqualToString:@"clickBtn"] && conditionVerified) { //just a double checking
        SecondViewController *controller = (SecondViewController *)segue.destinationViewController;
        [controller setManagedObjectContext:self.managedObjectContext];
    }
}

这将准备好你的segue以执行,只有当shouldPerformSegueWithIdentifier返回YES(真)时。因此,如果条件未经验证,您永远不必面对任何意外转换。

希望能帮助到您。


2

试一下这个。对我有用!

- (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender
{
    if ([identifier isEqualToString:@"Login"] && condition )
        { 
            return YES;
        }
        else if ([identifier isEqualToString:@"SignUp"])
        {
            return YES;
        }
        else
        {
            UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"OOPS!!" message:@"Incorrect Username Or Password" delegate:self cancelButtonTitle:nil otherButtonTitles:@"OK",nil];

            return NO;
        }

    }
     return YES;
}

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接