web-dev-qa-db-ja.com

iOSで戻るボタンを押したときに確認ポップアップを作成するにはどうすればよいですか?

誰かが私のiOSアプリの「戻る」ボタンを押したときにポップアップを追加して、本当に戻ってきたいかどうかをユーザーに尋ねたいと思います。次に、ユーザーの応答に応じて、アクションを元に戻したり続行したりします。ビューのviewWillDisappear関数にコードを追加して適切なデリゲートを書き込もうとしましたが、常にビューを変更してポップアップを表示するため、機能しません。私のコードは:

    -(void) viewWillDisappear:(BOOL)animated {
       _animated = animated;
       if ([self.navigationController.viewControllers indexOfObject:self]==NSNotFound) {
           UIAlertView *alert_undo = [[UIAlertView alloc] initWithTitle:@"UIAlertView"
                                                                message:@"You could be    loosing information with this action. Do you want to proceed?"
                                                               delegate:self
                                                      cancelButtonTitle:@"Go back"
                                                      otherButtonTitles:@"Yes", nil];
           [alert_undo show];
       }
       else [super viewWillDisappear:animated];
   }

デリゲートの実装は次のとおりです。

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
    NSString *title = [alertView buttonTitleAtIndex:buttonIndex];
    if([title isEqualToString:@"Yes"])
    {
        [super viewWillDisappear:_animated];
    }
}

これはまったく機能していません。誰かが今それを行うためのより良い方法または何が間違っている可能性がありますか?

どうもありがとうございました、

17
recasens

回答ありがとうございます、@ staticVoidMan!最後に、いくつかの変更を加えてコードを使用しました。戻るボタンは変更できないため、追加のボタンを作成して標準のボタンを非表示にする必要があります。唯一の問題は、新しい「戻る」ボタンのスタイルで、これは標準のものとは異なります。最終的なコードは次のとおりです。

- (void)viewDidLoad
{

    self.navigationItem.hidesBackButton = YES;
    UIBarButtonItem *bbtnBack = [[UIBarButtonItem alloc] initWithTitle:@"Back"
                                                                 style:UIBarButtonItemStyleBordered
                                                                target:self
                                                                action:@selector(goBack:)];

    self.navigationItem.leftBarButtonItem = bbtnBack;

}

- (void)goBack:(UIBarButtonItem *)sender
{
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Alert"
                                                    message:@"...Do you want to proceed?"
                                                   delegate:self
                                          cancelButtonTitle:@"No"
                                          otherButtonTitles:@"Yes", nil];
    [alert show];
}

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
    switch(buttonIndex) {
        case 0: //"No" pressed
            //do something?
            break;
        case 1: //"Yes" pressed
            //here you pop the viewController
            [self.navigationController popViewControllerAnimated:YES];
            break;
    }
}
15
recasens

一度-viewWillDisappear:が呼び出されました。あなたのviewControllerが消えることを止めることはできません。

理想的には、navigationBarの戻るボタンをオーバーライドし、そのメソッドでアラートを表示する必要があります(残りはほとんど同じです

- (void)viewDidLoad
{
    //...
    UIBarButtonItem *bbtnBack = [[UIBarButtonItem alloc] initWithTitle:@"Back"
                                                                 style:UIBarButtonItemStyleBordered
                                                                target:self
                                                                action:@selector(goBack:)];

    [self.navigationItem setBackBarButtonItem: bbtnBack];
}

- (void)goBack:(UIBarButtonItem *)sender
{
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Alert"
                                                    message:@"...Do you want to proceed?"
                                                   delegate:self
                                          cancelButtonTitle:@"No"
                                          otherButtonTitles:@"Yes", nil];
    [alert show];
}

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
    switch(buttonIndex) {
        case 0: //"No" pressed
            //do something?
            break;
        case 1: //"Yes" pressed
            //here you pop the viewController
            [self.navigationController popViewControllerAnimated:YES];
            break;
    }
}

[〜#〜] note [〜#〜]:宣言することを忘れないでください<UIAlertViewDelegate>。hこのviewControllerファイル内

18
staticVoidMan