【发布时间】:2012-05-29 09:46:36
【问题描述】:
为自定义UITableViewCell 的按钮处理按钮触摸事件的最佳做法是什么?
我的课程:
MyViewController, MyCustomCell
我能想到三个选项:
第一个选项- 将按钮作为MyCustomCell 的属性,然后在MyViewController .m 文件中将目标添加到它,并以MyViewController 作为目标。
MyViewController.m 文件
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"customCell";
MyCustomCell *cell = (MyCustomCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[MyCustomCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
[cell.theButton addTarget:self
action:@selector(theButtonTapped:)
forControlEvents:UIControlEventTouchUpInside];
}
// Configure the cell...
[self configureCell:cell atIndexPath:indexPath];
return cell;
}
- (void)theButtonTapped:(UIButton *)sender
{
MyCustomCell *selectedCell = (MyCustomCell *)sender.superview;
if (selectedCell) {
NSIndexPath *indexPath = [self.tableView indexPathForCell:selectedCell];
MyModel *selectedModel = [self.model objectAtIndex:indexPath.row];
// do something with the model...
}
}
第二个选项- 如果自定义单元格是在 IB 中制作的,将 nib File's Owner 设置为MyViewController,在MyViewController 中实现buttonTapped: 方法并连接按钮的Touch Up Inside 事件到buttonTapped: 方法。
第三个选项-如果自定义单元格不是在 IB 中创建的,则将目标添加到 MyCustomCell .m 文件中的按钮,并以 MyCustomCell 作为目标。
定义一个 MyCustomCellDelegate 将 @property (nonatomic, assign) id<MyCustomCellDelegate> delegate 添加到 MyCustomCell 并在点击按钮时调用此委托。
创建单元格时将MyViewController设置为单元格的代理,并实现MyCustomCellDelegate协议。
MyCustomCell.h 文件
@class MyCustomCell;
@protocol MyCustomCellDelegate <NSObject>
- (void)buttonTappedOnCell:(MyCustomCell *)cell;
@end
@interface MyCustomCell : UITableViewCell
@property (nonatomic, retain) UIButton *theButton;
@property (nonatomic, assign) id<MyCustomCellDelegate> delegate;
@end
MyCustomCell.m 文件
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self) {
// Initialization code
self.theButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
self.theButton.frame = CGRectMake(10,10,50,30);
[self addSubview:self.theButton];
[self.theButton addTarget:self
action:@selector(theButtonTapped:)
forControlEvents:UIControlEventTouchUpInside];
}
return self;
}
- (void)theButtonTapped:(UIButton *)sender
{
[self.delegate buttonTappedOnCell:self];
}
MyViewController.m 文件
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"customCell";
MyCustomCell *cell = (MyCustomCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[MyCustomCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
cell.delegate = self;
}
// Configure the cell...
[self configureCell:cell atIndexPath:indexPath];
return cell;
}
- (void)buttonTappedOnCell:(MyCustomCell *)selectedCell
{
if (selectedCell) {
NSIndexPath *indexPath = [self.tableView indexPathForCell:selectedCell];
MyModel *selectedModel = [self.model objectAtIndex:indexPath.row];
// do something with the model...
}
}
【问题讨论】:
-
我会选择选项 1。这对我来说似乎是最易读的。我使用了类似的方法,但我在自定义单元格中设置了委托,并在自定义单元格本身中处理按钮,然后通过检查委托是否存在来调用视图控制器中的函数。
标签: objective-c ios uitableview uibutton