Чтобы остановить сеанс и показать предупреждение

Используя раскадровки iOS 5, на кнопке я выполняю segue, то, что я хочу, - это сделать проверку на моем текстовом поле, и если проверка не выполнена, я должен остановить segue и бросить предупреждение. Каким образом это сделать?

Ответ 1

Если целью развертывания является iOS 6.0 или более поздняя версия

Вы можете просто реализовать метод shouldPerformSegueWithIdentifier:sender: на вашем контроллере представления исходного кода. Сделайте этот метод return YES, если вы хотите выполнить segue, или NO, если вы этого не сделаете.

Если цель развертывания установлена ​​раньше, чем iOS 6.0

Вам нужно будет изменить способ, которым ваш segue подключен в раскадровке, и написать немного больше кода.

Сначала настройте segue из контроллера кнопки на контроллер представления назначения, а не непосредственно от кнопки до места назначения. Дайте segue идентификатор типа ValidationSucceeded.

Затем подключите кнопку к действию на своем контроллере. В действии выполните проверку и либо выполните сеанс, либо покажите предупреждение, основанное на успешности проверки. Он будет выглядеть примерно так:

- (IBAction)performSegueIfValid:(id)sender {
    if ([self validationIsSuccessful]) {
        [self performSegueWithIdentifier:@"ValidationSucceeded" sender:self];
    } else {
        [self showAlertForValidationFailure];
    }
}

Ответ 2

Что сработало для меня и что я считаю правильным, это использовать метод UIViewController, найденный в Руководство для разработчиков Apple:

shouldPerformSegueWithIdentifier: отправитель:

Я применил свой метод следующим образом:

- (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender {
    if ([identifier isEqualToString:@"Identifier Of Segue Under Scrutiny"]) {
        // perform your computation to determine whether segue should occur

        BOOL segueShouldOccur = YES|NO; // you determine this
        if (!segueShouldOccur) {
            UIAlertView *notPermitted = [[UIAlertView alloc] 
                                initWithTitle:@"Alert" 
                                message:@"Segue not permitted (better message here)" 
                                delegate:nil 
                                cancelButtonTitle:@"OK" 
                                otherButtonTitles:nil];

            // shows alert to user
            [notPermitted show];

            // prevent segue from occurring 
            return NO;
        }
    }

    // by default perform the segue transition
    return YES;
}

Работал как шарм!


Обновлено с помощью Swift для >= iOS 8:

override func shouldPerformSegueWithIdentifier(identifier: String!, sender: AnyObject!) -> Bool {
    if identifier == "Identifier Of Segue Under Scrutiny" {
        // perform your computation to determine whether segue should occur

        let segueShouldOccur = true || false // you determine this
        if !segueShouldOccur {
            let notPermitted = UIAlertView(title: "Alert", message: "Segue not permitted (better message here)", delegate: nil, cancelButtonTitle: "OK")

            // shows alert to user
            notPermitted.show()

             // prevent segue from occurring
            return false
        }
    }

    // by default perform the segue transitio
    return true
}

Ответ 3

Я приведу вам пример, здесь мой код:

- (IBAction)Authentificate:(id)sender {
if([self WSAuthentification]){
   [self performSegueWithIdentifier:@"authentificationSegue" sender:sender];
}
else
{
    UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"Authetification Failed" message:@"Please check your Identifications" delegate:self cancelButtonTitle:@"Dismiss" otherButtonTitles:nil, nil];
    [alert show];
}

Но кажется, что не работает, во всех случаях выполняется мой сеанс. Ответ прост, мы вынуждены прокладывать сегмент из контроллера вида, но не из кнопки.