Раскадровка Xcode отменяет push, если условие не выполняется - PullRequest
15 голосов
/ 28 января 2012

У меня есть раскадровка с кнопкой в ​​элементе управления Navigation View, этот элемент управления также имеет текстовые поля, в которых используется раскадровка segue push.Однако у меня есть некоторая проверка ввода, и я предупреждаю пользователя, если какое-либо из текстовых полей пусто.

Я могу сделать это, НО предупреждает пользователя, а затем переключается на другое представление.

Есть ли способ отменить это push, если условие кнопки не выполнено в методе Pressed?

NB Это нажатие было создано интерфейсом раскадровки, а не кодом.

Ответы [ 3 ]

33 голосов
/ 28 января 2012

Не создавайте переход, перетаскивая от кнопки до контроллера назначения.Вместо этого просто перетащите с контроллера источника на контроллер назначения, чтобы создать переход.Нажмите на переход и используйте инспектор атрибутов, чтобы указать, что переход является толчком, и присвойте переходу идентификатор (goToDestination).Затем подключите кнопку к IBAction в контроллере представления источника.В методе IBAction проведите проверку, и если вы хотите выполнить push, добавьте следующую строку кода:

[self performSegueWithIdentifier: @"goToDestination" sender: self];
28 голосов
/ 22 сентября 2013

Следующее также может использоваться и будет работать для различных типов сегментов, таких как push, unwind и т. Д. Назовите 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;
}
0 голосов
/ 19 ноября 2015

Если buttonAction - это метод, который должен выполняться при нажатии кнопки, вы должны вызвать два метода внутри него: 1. Метод для проверки условий 2. Метод для контроля переходавыглядеть следующим образом

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

, а переход можно контролировать с помощью следующего сегмента кода

- (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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...