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

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


person Firdous    schedule 23.02.2012    source источник


Ответы (3)


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

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

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

Вам нужно будет изменить способ подключения перехода к раскадровке и написать еще немного кода.

Во-первых, настройте переход от контроллера представления кнопки к контроллеру представления назначения, а не непосредственно от кнопки к месту назначения. Дайте переходу идентификатор, например ValidationSucceeded.

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

- (IBAction)performSegueIfValid:(id)sender {
    if ([self validationIsSuccessful]) {
        [self performSegueWithIdentifier:@"ValidationSucceeded" sender:self];
    } else {
        [self showAlertForValidationFailure];
    }
}
person rob mayoff    schedule 23.02.2012
comment
Этого нет в документации, но похоже, что executeSegueWithIdentifier:sender: не вызывает shouldPerformSegueWithIdentifier:sender:. Поэтому, если вы программно запускаете переход, вы также должны программно проверить shouldPerformSegueWithIdentifier:sender: перед тем, как сделать это. - person Richard Venable; 14.11.2014

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

shouldPerformSegueWithIdentifier:sender:

Я реализовал свой метод так:

- (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
}
person Shaun    schedule 28.09.2012
comment
есть ли у использования PerformSegueIfValid() недостатки? - person Firdous; 28.09.2012
comment
Я считаю, что это пользовательский метод (не нашел его в документах) ... поэтому я не пробовал. Но, как я это вижу, с точки зрения дизайна не идеально использовать переходы раскадровки, а перенаправлять соединения из их типичных выходов для размещения функции. - person Shaun; 28.09.2012
comment
shouldPerformSegueWithIdentifier:sender: доступен, начиная с iOS 6, и не будет вызываться из iOS 5. - person levigroker; 22.10.2012
comment
Для новичков. Чтобы найти идентификатор перехода в конструкторе интерфейса, откройте раскадровку -> выберите сцену (слева), выберите переход (слева) в сцене, затем справа выберите инспектор атрибутов. Используйте поле Идентификатор. - person Nick N; 02.04.2013
comment
Это лучшее решение - должно быть сверху. - person GuybrushThreepwood; 15.01.2014
comment
Можно ли использовать это при использовании перехода Show (известного как переход Push в iOS 7 и более ранних версиях), чтобы остановить переход, предоставляемый UINavigationController? Я пробовал, но не смог заставить это работать. Я хочу остановить это раскручивание. - person alondono; 24.11.2014
comment
У вас есть идеи, почему это не называется. Мне нужно позвонить self.shouldPerformSegueWithIdentifier самому - person osrl; 08.01.2015
comment
@ osrl Если вы вызываете PerformSegueWithIdentifier программно, я считаю, что shouldPerformSegueWithIdentifier не вызывается (по задумке). Однако мне трудно найти документацию Apple, подтверждающую это. См. сообщение: stackoverflow.com/questions/26946566/ - person Shaun; 09.01.2015
comment
Не могу заставить его работать с UIAlertController. Приложение просто вылетает. - person Shmidt; 03.02.2016

Я приведу вам пример, вот мой код:

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

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

person Ali    schedule 20.06.2013