2010年5月17日月曜日

UIActionSheetクラス

UIActionSheetクラスは、重要なデータを消去したりする場合に、「本当に消去してよいですか?」等の様に確認の為に使用されるコントロールです。
WindowsでいうところのMessageBoxの様なものでしょうか?

UIActionSheetクラスのインスタンスの初期化には「initWithTitle」メソッドを使います。

- (id) initWithTitle: (NSString*) title
        delegate: (id < UIActionSheetDelegate>) delegate
        cancelButtonTitle: (NSString*) cancelButtonTitle
        destructiveButtonTitle: (NSString*) destructiveButtonTitle
        otherButtonTitle: (NSString*) otherButtonTitle1, otherButtonTitle2, ・・・

titleにはユーザーに問い合わせるメッセージを指定します。メッセージを表示しない時はnilを指定します。
delegateには、UIActionSheetクラスがdelegateで呼出すクラスを指定します。指定されたクラスは、UIActionSheetDelegateプロトコルを宣言する必要があります。
cancelButtonTitleには、キャンセルボタンに表示するメッセージを指定します。メッセージを表示しない時はnilを指定します。
destructiveButtonTitleには、消去をOKしたりするような時のボタンに表示するメッセージを指定します。メッセージを表示しない時はnilを指定します。
otherButtonTitleには、その他のボタンを表示する必要がある場合に指定します。カンマで区切って複数指定した場合は複数のボタンが表示されるようになります。このボタンが不要の場合はnilを指定します。


UIActionSheetコントロールのメッセージを表示する時は、UIActionSheetクラスのshowInViewメソッドを使います。

- (void) showInView: (UIView*)view
UIActionメッセージを表示する対象のUIViewクラスを指定します。


UIActionSheet上のボタンが押されたら、初期化メソッドで指定したクラスの以下のデリゲートが呼出されます。

- (void) actionSheet: (UIActionSheet*) actionSheet clickedButtonAtIndex: (NSInteger) buttonIndex
buttonIndexには、初期化メソッドで指定したボタンのインデックスが入ります。
インデックス順序は0がdestructiveButtonTitleで指定したボタン。1がotherButtonTitle1,2,3・・(指定した場合)と続き、最後のインデックスがcancelButtonTitleで指定したボタンになります。


以下がUIActionSheetの例です。

    // アクションシートを生成
    UIActionSheet* actSheet = [ [ UIActionSheet alloc ]
                                initWithTitle:@"Are you sure?"
                                delegate:self
                                cancelButtonTitle:@"CANCEL"
                                destructiveButtonTitle:@"OK"
                                otherButtonTitles:nil ];
   
    // アクションシートにタグを設定
    actSheet.tag = 1;
   
    // アクションシートを表示
    [ actSheet showInView: imageView ];
   
    // アクションシートは表示直後に解放してかまわない
    [ actSheet release ];


アクションシートは表示したらiPhone OS内部にメモリが確保されるそうなので、すぐにreleaseして構いません。

UIActionSheetを複数表示した場合、どのUIViewから呼出されたUIActionSheetか分からなくなります。この場合、どのアクションシートかを判定する為にtagプロパティに識別子を格納しておきます。

- (void) actionSheet: (UIActionSheet*) actionSheet clickedButtonAtIndex: (NSInteger) buttonIndex
{
    if ( actionSheet.tag == 1 )
    { // UIView1で生成したアクションシートから呼出されたdelegate
        if ( buttonIndex == 0 )

        { // OKボタン押下

            処理
        }
        if ( buttonIndex == 1 )
        { // キャンセルボタン押下
            処理
        }
    }
    else if ( actionSheet.tag == 2 )
    { // UIView2で生成したアクションシートから呼出されたdelegate
        if ( buttonIndex == 0 )
        { // OKボタン押下
            処理
        }
        if ( buttonIndex == 1 )
        { // キャンセルボタン押下
            処理
        }
    }
}

0 件のコメント:

コメントを投稿