这可能是新手,但是......
我在我的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不是合法的NSManagedObjectContext参数,用于搜索实体名称'Link''
事实上,如果我输入else语句,我不想进行此转换。怎么做?
答案 0 :(得分:16)
要选择性地禁止转换,请执行
- (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender
并根据您的情况返回YES
或NO
。在您的示例中:
- (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender
if ([identifier isEqualToString:@"clickBtn"]) {
return conditionVerified;
} else {
return YES;
}
}
在prepareForSegue:
中,抑制转变“为时已晚”。
答案 1 :(得分: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。
答案 2 :(得分:4)
为此目的,您应该以不同方式重构代码。如下所示实施shouldPerformSegueWithIdentifier
:
-(BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender {
return [identifier isEqualToString:@"clickBtn"] && conditionVerified;
}
如果条件未经验证,则会阻止执行segue“clickBtn”,即conditionVerified
为false。现在使用:
-(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执行。因此,如果未验证条件,您将永远不会面临任何意外转换。
希望它有所帮助。
答案 3 :(得分: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;
}
答案 4 :(得分:0)
更好的方法是使用此处提到的方法shouldPerformSegueWithIdentifier
:
https://stackoverflow.com/a/12818366/2500457