![](/img/trans.png)
[英]How can I run prepareForSegue After didSelectRowAtIndexPath?
[英]prepareForSegue : how can I set an if-condition?
这可能是新手,但......
我在Storyboard
两个ViewControllers
之间设置了一个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语句,我不想进行这种转换。 怎么办?
要选择性地抑制转换,请执行
- (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:
抑制转变“为时已晚”。
它不是让按钮执行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。
为此,您应该以不同方式重构代码。 实现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执行。 因此,如果未验证条件,您将永远不会面临任何意外转换。
希望能帮助到你。
试试吧。它对我有用!
- (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;
}
更好的方法是使用如下所述的方法shouldPerformSegueWithIdentifier
: https : shouldPerformSegueWithIdentifier
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.