Используя раскадровки 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];
}
Но кажется, что не работает, во всех случаях выполняется мой сеанс. Ответ прост, мы вынуждены прокладывать сегмент из контроллера вида, но не из кнопки.