我在导航视图控件中有一个带有按钮的故事板,此控件也包含文本字段,它使用故事板segue push
。
但是,我有一些输入检查,如果任何文本字段为空,我会提醒用户。
我可以这样做,但它会提醒用户,然后切换到另一个视图。
如果在Pressed方法按钮中未满足if条件,有没有办法取消此push
?
N.B此推送是由故事板界面创建的,而不是由代码创建的。
答案 0 :(得分:33)
不要通过从按钮拖动到目标控制器来创建segue。相反,只需从源控制器拖动到目标控制器即可创建segue。单击segue并使用属性检查器指定segue是push并给segue一个标识符(goToDestination)。然后将按钮连接到源视图控制器中的IBAction。在IBAction方法中进行检查,如果要进行推送,请添加以下代码行:
[self performSegueWithIdentifier: @"goToDestination" sender: self];
答案 1 :(得分:28)
以下内容也可以使用,适用于不同类型的段,如推,放等。从故事板中命名segue并使用此处给出的代码。如果您不希望执行特定的segue,则返回NO作为条件,默认返回YES。此方法应位于源视图控制器中。
- (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender {
if ([identifier isEqualToString:@"Segue_Name"]) {
NSLog(@"Segue Blocked");
//Put your validation code here and return YES or NO as needed
return NO;
}
return YES;
}
答案 2 :(得分:0)
如果buttonAction是必须在按钮单击上执行的方法,则必须在其中调用两个方法 1.检查条件的方法 2.控制segue的方法
- (IBAction)buttonAction:(id)sender
{
[self validateEnteredData];
[self shouldPerformSegueWithIdentifier:kSegueName sender:sender];
}
您的验证方法将如下所示
-(void)validateEnteredData
{
if (self.usernameTextField.text.length==0 && self.passwordTextField.text.length==0)
{
UIAlertView * alert=[[UIAlertView alloc]initWithTitle:kError message:kInvalidationMessage delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil];
[alert show];
return;
}
else if (![self.usernameTextField.text isEqualToString:@"admin"] && ![self.passwordTextField.text isEqualToString:@"pass"])
{
UIAlertView * alert=[[UIAlertView alloc]initWithTitle:kError message:kLoginFailed delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil];
[alert show];
return;
}
}
和segue可以通过以下代码段控制
- (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender
{
if ([identifier isEqualToString:kSegueName])
{
//Validation: Return NO if you don't want to execute the segue action
if (self.usernameTextField.text.length==0 && self.passwordTextField.text.length==0)
{
return NO;
}
else if (![self.usernameTextField.text isEqualToString:@"admin"] && ![self.passwordTextField.text isEqualToString:@"pass"])
{
return NO;
}
}
return YES;
}