Xcode раскадровка отменяет нажатие, если условие не выполняется
У меня есть раскадровка с кнопкой в Control View Control, этот элемент управления также имеет текстовые поля, в котором используется раскадровка segue push
.
Тем не менее, у меня есть проверка ввода, и я предупреждаю пользователя, если какое-либо из текстовых полей пуст.
Я могу это сделать, НО он предупреждает пользователя, а затем переключается на другое представление.
Есть ли способ отменить этот push
, если условие if не выполнено в нажатой кнопке "Прессованный"?
N.B Это нажатие было создано интерфейсом раскадровки, а не кодом.
Ответы
Ответ 1
Можно также использовать и работать для разных типов segues, таких как push, unwind и т.д. Назовите segue из раскадровки и используйте приведенный здесь код. Возвращайте NO для условия, если вы не хотите, чтобы конкретный segue выполнялся, и возвратите 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
Не создавайте сегмент, перетаскивая его с кнопки на контроллер назначения. Вместо этого просто перетащите с исходного контроллера на контроллер назначения, чтобы создать сегмент. Нажмите на segue и используйте инспектор атрибутов, чтобы указать, что segue является нажатием и дает segue идентификатор (goToDestination). Затем подключите кнопку к IBAction в контроллере представления источника. В методе IBAction выполните вашу проверку, и если вы хотите сделать push, добавьте эту строку кода:
[self performSegueWithIdentifier: @"goToDestination" sender: self];
Ответ 3
Если buttonAction - это метод, который должен выполняться при нажатии кнопки, вы должны вызвать в нем два метода
1. Способ проверки условий
2. Способ контроля сегмента
- (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;
}