Используя раскадровки iOS 5, на кнопке я выполняю переход, я хочу выполнить проверку в своем текстовом поле, и если проверка не удалась, я должен остановить переход и выдать предупреждение. Как это сделать?
Чтобы остановить переход и показать предупреждение
Ответы (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];
}
}
Что сработало для меня и что я считаю правильным ответом, так это использовать метод 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
}
self.shouldPerformSegueWithIdentifier
самому
- person osrl; 08.01.2015
Я приведу вам пример, вот мой код:
- (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];
}
Но похоже, что это не работает, во всех случаях выполняется мой переход. Ответ прост, мы должны подключить переход от самого контроллера представления, а не от кнопки.