Hatena::Groupiphone-dev

iPhoneアプリ開発まっしぐら★ このページをアンテナに追加 RSSフィード

引っ越し後の日記はコチラです

tokoromのその他の日記

2010-03-12

UIActionSheetをaddTargetでコーディングできるようにしたい

| 01:51 | はてなブックマーク -  UIActionSheetをaddTargetでコーディングできるようにしたい - iPhoneアプリ開発まっしぐら★

UIActionSheetを使っていて、ちょっとだけ不満だったことがあります。

それは、1つの画面で複数のUIActionSheetを使った時のactionSheet:clickedButtonAtIndex:メソッドのコードについてです。

UIActionSheetのボタンの押下をハンドリングするメソッドは1つなので、以下のようにif文やswitch文の入れ子にせざるを得ません。

- (void)showActionSheet1 {
  self.actionSheet1 = [[[UIActionSheet alloc] init] autorelease];
  self.actionSheet1.delegate = self;
  [self.actionSheet1 addButtonWithTitle:@"Action1"];
  [self.actionSheet1 addButtonWithTitle:@"Action2"];
  [self.actionSheet1 addButtonWithTitle:@"Cancel"];
  self.actionSheet1.cancelButtonIndex = 2;
  [self.actionSheet1 showInView:self.view];
}

- (void)showActionSheet2 {
  self.actionSheet2 = [[[UIActionSheet alloc] init] autorelease];
  self.actionSheet2.delegate = self;
  [self.actionSheet2 addButtonWithTitle:@"Action1"];
  [self.actionSheet2 addButtonWithTitle:@"Action3"];
  [self.actionSheet2 showInView:self.view];
}

- (void)actionSheet:(UIActionSheet*)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex {
  if ( buttonIndex == actionSheet.cancelButtonIndex ) {
    // キャンセルされたとき
  } else {
    if ( actionSheet1 == actionSheet ) {
      // アクションシート1
      switch ( buttonIndex ) {
        case 0:
          // 1番上のボタンが押されたんならこんな処理
          break;
        case 1:
          // 2番めのボタンが押されたんならこんな処理
          break;
        default:
          break;
      }
    } else if ( actionSheet2 == actionSheet ) {
      // アクションシート2
      switch ( buttonIndex ) {
        case 0:
          // 1番上のボタンが押されたんならこんな処理
          break;
        case 1:
          // 2番めのボタンが押されたんならこんな処理
          break;
        default:
          break;
      }
    }
  }
}

こういった書き方は個人的にはあまり好きではありません。

できれば、UIButtonへactionを登録するようなイメージで、こんな感じで書きたいところです。

- (void)showActionSheet1 {
  self.actionSheet = [[[UIActionSheet alloc] init] autorelease];
  [self.actionSheet addButtonWithTitle:@"Action1"];
  [self.actionSheet addButtonWithTitle:@"Action2"];
  [self.actionSheet addButtonWithTitle:@"Cancel"];
  [self.actionSheet addTarget:self action:@selector(action1)];
  [self.actionSheet addTarget:self action:@selector(action2)];
  self.actionSheet.cancelButtonIndex = 2;
  [self.actionSheet showInView:self.view];
}

- (void)showActionSheet2 {
  self.actionSheet = [[[UIActionSheet alloc] init] autorelease];
  [self.actionSheet addButtonWithTitle:@"Action1"];
  [self.actionSheet addButtonWithTitle:@"Action3"];
  [self.actionSheet addTarget:self action:@selector(action1)];
  [self.actionSheet addTarget:self action:@selector(action3)];
  [self.actionSheet showInView:self.view];
}

- (void)action1 {
  // Action1 にたいするアクション
}

- (void)action2 {
  // Action2 にたいするアクション
}

- (void)action3 {
  // Action3 にたいするアクション
}

ということで、この書き方で使えるようILActionSheetという名前でUIActionSheetを継承した子クラスを作成して使うことにしました。

そのコードは、参考までに

に置いてあります。

また、このクラスを実際に使ってみたサンプルコードも、

に置いてみました。

paellapaella2010/03/15 14:23UIActionSheetは文字列の配列を使った初期化が出来ないのも面倒ですね。
配列を数え上げてaddButtonWithTitle:すればよいのですが、それはUIActionSheet側で行えばよいのでは?と思っています。
(初期化した後に配列を使って…というのはややこしくなってしまいますが)

tokoromtokorom2010/03/16 04:11おお、たしかに配列で指定できたほうが、コードがすっきりする場面がありそうですねー^^

harahara2010/03/17 18:25UIActionSheetを状態によって数パターン用意したときのclickedButtonAtIndexが嫌だったんですよね。これはいいですね便利。

stormstorm2010/08/13 19:41iPhoneソフトの開発法を調べていたらたどり着きました。
ものすごく便利なクラスを作られたんですねー。

よろしかったら商用アプリでコード使わせてもらっても問題ないですか?

tokoromtokorom2010/08/13 21:35まったく問題ないです!かわいがってやってください。

stormstorm2010/08/23 13:53ありがとうございます。
急な出張があったものですから、お礼が遅れて申し訳ありません。

それでは早速 使わせていただきます。 ソース今よりがスッキリしそうな予感です。

tokentokentokentoken2011/03/16 23:27確かにILActionSheetは便利です。ありがとうございました!