在使用Segue的时候,我们会发现如果给一个button添加跳转到另一个controller的Segue后,只要点击这个button,就会直接跳转到指定的那个controller,这在有些时候是合理的,但是在一些特殊情况下,我们需要在跳转之前处理一些逻辑,然后根据处理结果选择是否跳转,例如:登录。
iOS提供了控制Segue是否立即跳转的方法:
shouldPerformSegueWithIdentifier:sender:
阻止Segue跳转
- 创建一个Single View Application,在storyboard中添加两个View Controller,第一个上添加个button,并为这个button添加一个指向另一个View Controller的Segue,Segue的类型为Present Modally,如下图所示:
运行程序,此时点击不跳转按钮会进行跳转:
为了阻止跳转,我们通过shouldPerformSegueWithIdentifier:sender:方法。首先,点击Segue的箭头,右方会显示Segue的一些信息,我们为Segue设置一个identifier,值为”nosegue”,如下图所示:
然后在ViewController.m文件中添加以下代码:
//在此方法中阻止某个Segue跳转,返回YES则跳转,返回NO,则不跳转
- (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender
{
//如果Segue的identifier为nosegue,则不跳转
if ([identifier isEqualToString:@"nosegue"]) {
return NO;
}
return YES;
}
再次运行程序,点击button,不会执行跳转。
控制跳转的时机
通过上面的方法,我们可以使一个Segue不自动执行跳转,下面我们通过代码来控制Segue跳转的时机。
1. 在第一个页面上添加一个TextField,并创建对应的IBOutlet,命名为inputText。
2. 为button创建一个点击事件:- (IBAction)buttonTapped:(id)sender,并添加如下代码:
- (IBAction)buttonTapped:(id)sender {
if ([_inputText.text isEqualToString:@"james"]) {
//触发identifier为nosegue的Segue
[self performSegueWithIdentifier:@"nosegue" sender:sender];
}
else
{
//do nothing
}
}
- 运行程序,效果如下: