UIActionSheet のサブクラス化

2010年7月27日火曜日 | Published in | 0 コメント

このエントリーをはてなブックマークに追加

初期化メソッドの最後が可変引数なので、これをオーバーライドする場合は工夫が必要。

初期化メソッドのオーバーライド


可変引数はあとから -[addButtonWithTitle:]で追加してやる。

- (id)initWithTitle:(NSString *)title
 delegate:(id < UIActionSheetDelegate >)delegate
 cancelButtonTitle:(NSString *)cancelButtonTitle
 destructiveButtonTitle:(NSString *)destructiveButtonTitle
 otherButtonTitles:(NSString *)firstOtherTitle,...
{
 self = [super initWithTitle:title
        delegate:delegate
     cancelButtonTitle:nil
   destructiveButtonTitle:nil
     otherButtonTitles:nil];


 if (self) {
  int index = 0;
  
  if (destructiveButtonTitle) {
   [self addButtonWithTitle:destructiveButtonTitle];
   self.destructiveButtonIndex = index;
   index++;
  }
  
  if (firstOtherTitle) {
   [self addButtonWithTitle:firstOtherTitle];
   index++;
 
   va_list args;
   va_start(args, firstOtherTitle);
   NSString* title;
   while (title = va_arg(args, NSString*)) {
    [self addButtonWithTitle:title];
    index++;
   }
   va_end(args);
  }
  
  [self addButtonWithTitle:cancelButtonTitle];
  self.cancelButtonIndex = index;
 }
 return self;
}

試しに呼び出すとこんな感じ。ちゃんと動いているようだ。

なお self=[super ...] で cancel と destructive ボタンを指定すると順番がおかしくなる。


これを防ぐために cancel と destructive ボタンも標準の順番に合うように追加している。


参考情報

UIActionSheet addButtonWithTitle: doesn't add buttons in the right order - Stack Overflow
今回の方法が載っていた
CodeResource - Uncategorized Messages - Uiactionsheet And Popviewcontrolleranimated
同様の方法が示されていた
Cocoa with Love: Variable argument lists in Cocoa
Cocoaにおける可変引数の記事
Cocoaの日々 - 2005年1月
当ブログでも大昔に取り上げたことがあった。
UIActionSheet Class Reference
リファレンス

- - - -
次回は UIActionSheet の Blocks化をやります(今回はその伏線)。

Responses

Leave a Response

人気の投稿(過去 30日間)