web-dev-qa-db-ja.com

セグエを停止してアラートを表示するには

IOS 5ストーリーボードを使用して、セグエを実行しているボタンで、テキストフィールドで検証を行い、検証が失敗した場合、セグエを停止してアラートをスローする必要があります。それを行う方法は何ですか?

39
Firdous

展開ターゲットがiOS 6.0以降の場合

ソースView ControllerでshouldPerformSegueWithIdentifier:sender:メソッドを実装するだけです。セグエを実行する場合はこのメソッドがYESを返し、実行しない場合はNOを返します。

展開ターゲットがiOS 6.0より前の場合

ストーリーボードでセグエの接続方法を変更し、もう少しコードを記述する必要があります。

まず、ボタンから宛先に直接ではなく、ボタンのView Controllerから宛先View Controllerにセグエを設定します。セグエにValidationSucceededのような識別子を付けます。

次に、ボタンをView Controllerのアクションに接続します。アクションでは、検証を実行し、セグエを実行するか、検証が成功したかどうかに基づいてアラートを表示します。次のようになります。

- (IBAction)performSegueIfValid:(id)sender {
    if ([self validationIsSuccessful]) {
        [self performSegueWithIdentifier:@"ValidationSucceeded" sender:self];
    } else {
        [self showAlertForValidationFailure];
    }
}
77
rob mayoff

私にとってうまくいき、正しい答えだと思うのは、 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
}
38
Shaun

例を挙げましょう、ここに私のコードがあります:

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

しかし、それは機能していないようです。すべての場合で、セグエが実行されます。答えは簡単です。ボタンからではなく、ビューコントローラからセグエを配線する必要があります。

0
Ali