iOS – アクションシートの実装方法

ActionSheetの例アクションシート(ActionSheet)は左図のように削除処理などの重要な処理を行う前にユーザーに確認を促すために使われることが多いと思います。このメモではそのアクションシートの実装方法について紹介します。

方法
まず以下のhファイルから見ていきます。ポイントはUIActionSheetDelegateプロトコルの実装を宣言いるところです。このプロトコルのデリゲートメソッドを当該クラスに実装し、アクションシートのデリゲート先をそのクラスに指定すれば、アクションシートのイベントをそのクラスで処理することができます。

@interface TWViewController : UIViewController <UIActionSheetDelegate> {
    // 削除確認用のアクションシート
    UIActionSheet *_deleteConfrimActionSheet;
}

 

次にmファイルを見てみます。アクションシートのインスタンスを作成するときにアクションシートのタイトル、表示するボタンを設定しています。otherButtonTitles引数にカンマ区切りでボタン名を指定すればアクションシート上のボタンを増やしていくことができます。(3行目)

デリゲートメソッドは2つあり、上から1つ目のデリゲートメソッド(8行目)のbuttonIndex引数に押されたボタンの番号が渡されてきます。このボタン番号はアクションシートの上から0, 1, 2, ...と採番されています。なので、一番上のボタンが押されたときは"0"が渡されてくるわけです。このボタン番号を見て処理を分岐することができます。

2つ目のデリゲートメソッド(17行目)はアクションシートのキャンセルボタンが押されたときに呼び出されます。

// 削除ボタンが押下されたときに行われる処理
- (IBAction)deleteComfirm:(id)sender {
    _deleteConfrimActionSheet = [[UIActionSheet alloc] initWithTitle:@"この在庫データを削除してよろしいですか?" delegate:self cancelButtonTitle:@"キャンセル" destructiveButtonTitle:@"削除" otherButtonTitles:nil];
    [_deleteConfrimActionSheet showInView:self.view];
}

// アクションシート上のボタンが押下されたときに呼び出されるデリゲートメソッド
- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex
{
    if (buttonIndex == 0) {
        // 「削除」ボタンが押された場合には削除処理を実行する
        [self deleteItem];
    }
}

// アクションシート上のキャンセルボタンが押下されたときに呼び出されるデリゲートメソッド
- (void)actionSheet:(UIActionSheet *)actionSheet didDismissWithButtonIndex:(NSInteger)buttonIndex
{
    _deleteConfrimActionSheet = nil;
}

 

ハマったところ
あるときアクションシートの一番下のキャンセルボタンを押しても反応しないという現象に遭遇しました。 調べてみたところ、どうやらタブ(UITabBarController)がある場合にこの現象が発生するみたいです。この場合は、上記のソースコードの4行目を以下のように変えると解決します。

[_deleteConfrimActionSheet showInView:self.view.window];

viewではなく、window上にアクションシートを表示することでタブとの衝突を回避できるみたいです。

 

あー早く冬休みにならないかなぁ。。