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上にアクションシートを表示することでタブとの衝突を回避できるみたいです。

 

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

iOS – タブを切り替えたときに処理を実行する

iPhoneのタブの切替

UITabBarControllerwを使用することでタブ機能を実現することができると思いますが、このメモではタブを切り替えたタイミングで処理を行う方法について紹介します。

…ただ、この方法がベストプラクティスとは思えないので、もっといい方法があれば是非教えてくださいm(__)m

 

方法
以下の.hファイルのソースのように、UITabBarControllerwを継承した新しいクラスを作成します。また、このクラスにUITabBarControllerDelegateプロトコルに対応していることを宣言します。

// TWTabBarController.h
@interface TWTabBarController : UITabBarController<UITabBarControllerDelegate>@end

.mファイルにはUITabBarControllerDelegateプロトコルのデリゲート先を新しく作成したクラスに指定し、そのデリゲートメソッドを実装します。このデリゲートメソッド内の処理がタブ切替時に呼び出される処理になります。

// TWTabBarController.m
@implementation TWTabBarController

- (void)viewDidLoad
{
    [super viewDidLoad];
    // デリゲート先を本クラスに指定
    self.delegate = self;
}

// タブが切替られたときに呼び出されるデリゲートメソッド
- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController {
    // ここに記述された処理がタブの切替時に呼び出される
}

最後に、このTabControllerクラスをStoryboard上のUITabBarControllerwと紐付けます。Storyboardを開いてTab Bar Controllerを選択し、Custom Classに新たに作成したクラス名を設定します。
Custom Classに新たに作成したTabBarControllerクラスを指定

 

まとめ

  • UITabBarControllerDelegateプロトコルを実装し、そのデリゲートメソッド内にタブ切替時に行いたい処理を記述する