0

UITableCellView に UIButton を追加する方法については、いくつかの議論があります。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

メソッドとボタン クリックの処理方法について説明します。私はそれらをテストしましたが、それらは多かれ少なかれ正常に動作します。

私は少し異なる設定をしています。UIButton を追加したい - 実際、カスタム UITableCellView クラス内で、スワイプ タッチを使用して非表示/表示する、異なる UIImageViews に配置されたいくつかのボタンがあります。簡単にするために、セルのビュー スタックに UIImageView が 1 つだけ追加され、UIButton が 1 つだけあるとします。

これは、私の UITableViewCell 実装の関連部分です。

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
   self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
   if (self) {
     // sub menu
     self.tableCellSubMenu = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 320.0, 88.0)];
     [self.tableCellSubMenu setImage:[UIImage imageNamed:@"cell_menu_back"]];
     [self addSubview:self.tableCellSubMenu];

     UIButton *but = [UIButton buttonWithType:UIButtonTypeCustom];                              
     but.frame = CGRectMake(10.0, 0, 77.0, 88.0);
     [but setImage:[UIImage imageNamed:@"cell_menu_icon_plus_up"] forState:UIControlStateNormal];
     [but setImage:[UIImage imageNamed:@"cell_menu_icon_plus_down"] forState:UIControlStateSelected];
     [but setImage:[UIImage imageNamed:@"cell_menu_icon_plus_down"] forState:UIControlStateHighlighted];
     [but addTarget:self action:@selector(tableCellButtonPress:) forControlEvents:UIControlEventTouchUpInside];
     [self.tableCellSubMenu addSubview:but];
     ...
     }
   return self;
}

UIButton は UIImageView に追加され、セルのビュー スタックに追加されます。簡単にするために、ボタンのターゲットを「self」に設定しました。私の実際のセットアップでは、ターゲットはボタン イベントを処理する UITableViewController です。すべてのセットアップが機能していることを保証できます (たとえば、後で説明するように、UIImageView を UIControl に置き換えることによって)。

残念ながら、この構成では、ボタンの touch up inside イベントは発生しません。呼び出される唯一の関数は

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

コントローラーで。通常、UIControl ビューに UIButtons を配置します。そうは言っても、上記のコードで UIImageView を UIControl に置き換えると、期待どおりにボタン イベントが発生しますが、

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

もう呼び出されません。両方欲しい。

これを機能させる方法は?

更新 1:

カスタム UITableViewCell 実装で次のメソッドを実装しました。

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    CGPoint location = [((UITouch *)[touches anyObject]) locationInView:self];
    if (CGRectContainsPoint(but.frame, location)) {
      [self.touchButtonDelegate tableViewCellButtonTouched:self button:(UIButton*)but indexPath:self.touchButtonIndexPath];
    }
    [super touchesBegan:touches withEvent:event];
}

私はまだ「UIImageView」を使用して、いくつかのボタンをグループ化して配置しています。

self.touchButtonDelegateは UITableViewController ですより完全なソリューションは、こちらで入手できます。

4

1 に答える 1

0

UIImageViews では、ユーザー インタラクションが有効になっていません。セル自体または別の UIView に追加する必要があります。

于 2012-11-21T15:43:13.617 に答える