IOS/Objective-C:检测自定义表格视图单元格中的按钮按下?
Posted
技术标签:
【中文标题】IOS/Objective-C:检测自定义表格视图单元格中的按钮按下?【英文标题】:IOS/Objective-C: Detect Button Press in Custom Tableview Cell? 【发布时间】:2017-10-29 15:48:42 【问题描述】:对于提要视图控制器,我有一个表格视图,其中包含一些自定义单元格,其中包含用于喜欢、评论和分享的按钮。我想根据按下的按钮执行不同的操作。
我最初的想法是简单地将故事板中自定义单元格中的按钮连接到自定义单元格中的操作方法。但是,我对自定义单元 .m 文件中的方法如何与视图控制器中的 TableView 交互感到困惑。
- (IBAction)likeButtonPressed:(id)sender
CGPoint buttonPosition = [sender convertPoint:CGPointZero toView:self.tableView];
NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:buttonPosition];
//do something
谁能澄清一下单元格中的按钮是否可以连接到情节提要中,以及这如何与视图控制器、cellforrowatindexpath 和 didselectrowatindexpath 上的委托方法一起使用?
或者,如果这不是正确的方法,将不胜感激任何关于更好方法的建议。提前感谢您的任何建议。
【问题讨论】:
【参考方案1】:您可以简单地使用 blocks
来代替 delegate
或 tags
。 Blocks
比 delegate
模式更容易使用,推荐使用。
在Swift
中,您会看到closures (blocks in Objective-C)
的广泛使用比任何其他模式都多。
示例:
1. UITableViewDataSource
方法
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
return 1;
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
TableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell" forIndexPath:indexPath];
cell.likeButtonTapHandler = ^
NSLog(@"Like Button Tapped");
//ADD YOUR CODE HERE
;
cell.commentButtonTapHandler = ^
NSLog(@"Comment Button Tapped");
//ADD YOUR CODE HERE
;
cell.shareButtonTapHandler = ^
NSLog(@"Share Button Tapped");
//ADD YOUR CODE HERE
;
return cell;
2。自定义 UITableView 单元格
@interface TableViewCell : UITableViewCell
@property (nonatomic, copy) void(^likeButtonTapHandler)(void);
@property (nonatomic, copy) void(^commentButtonTapHandler)(void);
@property (nonatomic, copy) void(^shareButtonTapHandler)(void);
@end
@implementation TableViewCell
- (IBAction)likeButtonTapped:(UIButton *)sender
self.likeButtonTapHandler();
- (IBAction)commentButtonTapped:(UIButton *)sender
self.commentButtonTapHandler();
- (IBAction)shareButtonTapped:(UIButton *)sender
self.shareButtonTapHandler();
【讨论】:
我最终使用了这种方法。 Roohul 方法也可能有效,但这很容易实现 当然..快乐编码?【参考方案2】:您可以通过两种方式做到这一点。最好是第一个牢记 Objective-C 设计模式。
使用委托模式
您可以通过按钮 ID(可以是标签或枚举)和单元格对象向您的视图控制器发送回调并在那里处理内容。
根据indexPath
使用标签
例如,如果您只有行而没有列,那么您可以根据它们的行号和按钮类型分配按钮标签,如果您有行和部分,您可以根据行和部分编号分配标签,然后分配选择器到CellForRowAtIndexPath
中的按钮,然后你可以通过解码sender
的标签来获取行号
现在,扩展第一种方法,无需获取按钮的位置。只需调用将在您的 ViewControler 中观察到的该按钮的委托方法。
在您的自定义单元格类中。
@protocol YourCellButtonsDelegate <NSObject>
@optional
- (void)likeButtonTappedForCell:(UITableViewCell *)cell;
- (void)commentButtonTappedForCell:(UITableViewCell *)cell;
- (void)shareButtonTappedForCell:(UITableViewCell *)cell;
@end
@interface YourCell : UITableViewCell
@property (nonatomic, weak) id <YourCellButtonsDelegate> buttonsDelegate;
@end
Like 按钮的 Action 方法示例如下。
- (IBAction)likeButtonPressed:(id)sender
[self.buttonsDelegate likeButtonTappedForCell:self];
在您的CellForRowAtIndex
方法中的ViewController
类中初始化并分配给YourCell 后,按如下方式分配委托
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
static NSString *CellIdentifier = @"YourCellIdentifier";
YourCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
//do your stuffs here.
cell.delegate = self
并实现委托方法如下。
- (void)likeButtonTappedForCell:(UITableViewCell *)cell
NSIndexPath *indexPath = [self.tableView indexPathForCell:cell];
//you can get the row from the indexPath here.
别忘了在你的 ViewController 类中确认委托。
【讨论】:
对不起,我对此很敏感。你能推荐第一种方法的代码吗?以上是关于IOS/Objective-C:检测自定义表格视图单元格中的按钮按下?的主要内容,如果未能解决你的问题,请参考以下文章
在自定义表格单元格内检测多个 UI 视图的点击/触摸的理想方法是啥?
IOS/Objective-C:在没有 Storyboard Segue 的情况下可以在模态转换中使用自定义 Segue?
IOS/Objective-C:导航栏自定义Segue效果对比Show Segue