2012-02-24

UIActionSheetのボタンをNSArrayで指定

iPhoneアプリの開発で、UIActionSheetを表示するとき項目を配列で指定したいことはよくあると思います。たとえば、iOS 5で追加されたTwitter APIを利用できるかによって、表示項目の数を動的に変更したい場合などです。
しかし不便なことに、initWithTitleのotherButtonTitlesには、配列を渡すことができません。
この問題に対処するためには、一度ボタンなしでUIActionSheetを初期化した後で、項目をaddButtonWithTitleで追加していくことになります。
ただしこのとき注意が必要なのは、初期化のときに、キャンセルボタンをつくってはいけないということです。他のボタンを追加した後でキャンセルボタンを指定しないと、iOS 4.xのバグでボタンのインデックスがメチャクチャになってしまい、actionSheet:clickedButtonAtIndex: の処理が正常に行えなくなります。(iOS 5では正常に動作するようです。)

だいたい次のようなコードになるかと思います。

// ボタンなしで一度初期化する
UIActionSheet* sheet =[ [[UIActionSheet alloc] initWithTitle:NSLocalizedString(@"ActionSheetTitle", nil) delegate:self cancelButtonTitle:nil destructiveButtonTitle:nil otherButtonTitles:nil] autorelease];
// ボタンを追加
NSArray* buttonTitleArray = [MyButtons array];
for (NSString* buttonTitle in buttonTitleArray) {
[sheet addButtonWithTitle:buttonTitle];
}
// 古いiOSには、キャンセルボタンも後から追加しないインデクスが狂うバグがある
sheet.cancelButtonIndex = [sheet addButtonWithTitle:NSLocalizedString(@"Cancel", nil)];

0 件のコメント: