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