5

这可能很菜鸟,但是...

ViewControllers我在我的Storyboard, 和标识符之间设置了一个 segue clickBtn

现在我在我的代码中这样称呼它:

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

由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“+entityForName:nil 不是搜索实体名称“Link”的合法 NSManagedObjectContext 参数

事实上,如果我输入 else 语句,我不想​​进行这种转换。怎么做?

4

5 回答 5

16

要选择性地抑制转换,请实现

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

并返回YESor NO,具体取决于您的情况。在您的示例中:

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

prepareForSegue:抑制过渡“为时已晚” 。

于 2013-11-05T22:08:51.460 回答
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。

于 2013-11-05T22:02:59.007 回答
4

为此,您应该以不同的方式重构您的代码。实现shouldPerformSegueWithIdentifier如下:

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

conditionVerified如果条件未验证,即为假,它将阻止执行 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];
    }
}

只有在shouldPerformSegueWithIdentifier返回 YES(true) 的情况下,这才会让你的 segue 为执行做好准备。因此,如果条件未得到验证,您将永远不必面对任何意外的转换。

希望能帮助到你。

于 2013-11-05T22:22:37.953 回答
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;
}
于 2015-06-16T06:42:39.247 回答
0

更好的方法是使用shouldPerformSegueWithIdentifier这里提到的方法: https ://stackoverflow.com/a/12818366/2500457

于 2016-08-29T10:15:36.400 回答