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;
}