IOS 5ストーリーボードを使用して、セグエを実行しているボタンで、テキストフィールドで検証を行い、検証が失敗した場合、セグエを停止してアラートをスローする必要があります。それを行う方法は何ですか?
ソースView ControllerでshouldPerformSegueWithIdentifier:sender:
メソッドを実装するだけです。セグエを実行する場合はこのメソッドがYES
を返し、実行しない場合はNO
を返します。
ストーリーボードでセグエの接続方法を変更し、もう少しコードを記述する必要があります。
まず、ボタンから宛先に直接ではなく、ボタンのView Controllerから宛先View Controllerにセグエを設定します。セグエにValidationSucceeded
のような識別子を付けます。
次に、ボタンをView Controllerのアクションに接続します。アクションでは、検証を実行し、セグエを実行するか、検証が成功したかどうかに基づいてアラートを表示します。次のようになります。
- (IBAction)performSegueIfValid:(id)sender {
if ([self validationIsSuccessful]) {
[self performSegueWithIdentifier:@"ValidationSucceeded" sender:self];
} else {
[self showAlertForValidationFailure];
}
}
私にとってうまくいき、正しい答えだと思うのは、 Apple Developer Guide にあるUIViewControllerメソッドを使用することです。
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 for> = 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
}
例を挙げましょう、ここに私のコードがあります:
- (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];
}
しかし、それは機能していないようです。すべての場合で、セグエが実行されます。答えは簡単です。ボタンからではなく、ビューコントローラからセグエを配線する必要があります。