目标c - 处理自定义UITableViewCell按钮的按钮触摸事件的最佳实践
处理自定义 UITableViewCell
按钮的按钮触摸事件的最佳做法是什么?
What is best practice to handle a button touch event for a button of a custom UITableViewCell
?
我的课程: MyViewController
, MyCustomCell
我可以想到三个选项:
第一个选项 - 拥有按钮作为 MyCustomCell
的属性,然后使用 MyViewController .m文件中添加目标$ c> MyViewController 作为目标。
First option- Have the button as a property of MyCustomCell
, and then add a target to it in the MyViewController
.m file with MyViewController
as the target.
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文件的所有者设置为 MyViewController
,实现 buttonTapped:
MyViewController
中的方法,并将按钮的Touch Up Inside事件连接到 buttonTapped:
方法。
Second option- If the custom cell was made in IB, Set the nib File's Owner to be MyViewController
, implement buttonTapped:
method in MyViewController
and connect the button's Touch Up Inside event to the buttonTapped:
method.
第三个选项 - 如果自定义单元格未在IB中制作,则将目标添加到按钮中以 MyCustomCell
作为目标的 MyCustomCell
.m文件。
定义 MyCustomCellDelegate
add @property(nonatomic,assign)id< MyCustomCellDelegate>委托
到 MyCustomCell
并在按下按钮时调用此委托。
设置 MyViewController
作为创建单元格时的单元格委托并实现 MyCustomCellDelegate
协议。
Third option- if the custom cell wasn't made in IB, add a target to the button in the MyCustomCell
.m file with MyCustomCell
as the target.
Define a MyCustomCellDelegate
add @property (nonatomic, assign) id<MyCustomCellDelegate> delegate
to MyCustomCell
and call this delegate when button tapped.
Set MyViewController
as the cell's delegate when creating cells and implement the MyCustomCellDelegate
protocol.
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 file
- (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...
}
}
将单元格的行存储为自定义按钮的标记
属性。
Store the row of the cell as tag
property of your custom button.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
// bla bla bla
if (!cell)
{
//bla bla bla
[cell.yourButton addTarget:self selector:@selector(yourButtonTapped:) forControlEvents:UIControlEventTouchUpInside];
}
// bla bla bla
cell.yourButton.tag = indexPath.row;
}
-(void)yourButtonTapped:(id)sender
{
int tag = [(UIButton *)sender tag];
NSLog(@"tapped button in cell at row %i", tag);
}