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 です。より完全なソリューションは、こちらで入手できます。