如何在 Objective-C 和 Swift 中实现“didSelectButtonInCellAtIndexPath:”?
Posted
技术标签:
【中文标题】如何在 Objective-C 和 Swift 中实现“didSelectButtonInCellAtIndexPath:”?【英文标题】:How to implement "didSelectButtonInCellAtIndexPath:" in Objective-C and Swift? 【发布时间】:2018-08-27 07:13:41 【问题描述】:我熟悉“UITableViewDelegate”。
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
有权力。
如何在 Objective-C 中实现 "tableView: didSelectButtonInCellAtIndexPath: " ,在 Swift 中也很棒。
如下图:
当点击红色圆圈中的按钮时,我使用自定义 UITableViewCell 委托。
那么如何将 UITableViewCell 委托升级为自定义 UITableView 委托,以优雅地处理事件。
【问题讨论】:
只需在.touchUpInside
上的按钮操作中处理它。您不想在didSelect
中处理它,因为那里有多个按钮。
如果可以,逻辑统一,可读性更强。
【参考方案1】:
很简单,其实有几种方法可以实现你想要的:
使用代码块。您可以将代码块作为按钮选择的处理程序,例如var buttonSelectionHandler: ((_ index: IndexPath?) -> ())?
,并在按钮的选择器上调用它。块的参数index
可以用来指示哪个单元格负责该操作,不要忘记,您应该将索引路径存储在UITableViewDataSource
的cellForRowAtIndex
上,并在自定义单元格上具有适当的属性。
创建具有您在协议中的问题中所说的功能的自定义协议,制作您的视图控制器或视图模型或您用作UITableViewDataSource
的任何其他东西以确认该协议,添加属性该协议的类型,将实现对象分配给属性,并在选择按钮时调用该方法。
还有其他一些方法,但我认为这足以解决您的问题。希望这会有所帮助!
【讨论】:
我想深入了解一下 tableView。您的解决方案非常常见且很好。首选自定义- (void)tableView:(UITableView *)tableView didEndEditingRowAtIndexPath:(NSIndexPath *)indexPath
。通过 tableView 固有地在 cell 和 viewController 之间建立连接【参考方案2】:
我更喜欢使用 Block(Objective-C) 或 Closure(Swift)
而不是 Delegate这些是示例如何优雅地管理按钮上的操作,如果需要更新单元格,那么这也可以轻松处理,无需刷新整个 tableview 和所有。
在 Objective-C 中:
CustomTableViewCell.h
@property (nonatomic, weak) IBOutlet UIButton *button;
@property (nonatomic, copy) void (^ButtonTapAction)(CustomTableViewCell *aCell);
CustomTableViewCell.m
//Method assign to that button
- (IBAction)arrowButtonTapped:(id)sender
if (self.ButtonTapAction)
self.ButtonTapAction(self);
cell 用于tableview cellForRowAtIndexpath:
__weak typeof(self) weakSelf = self;
cell.arrowButtonTapAction = ^(CustomTableViewCell *aCell)
// Do Whatever you want to do on the button click
;
通过使用此代码,您无需重新加载 Cell。
在 Swift 中:
CustomTableCell.swift
typealias ButtonHandler = (_ aCell:CustomTableCell) -> Void
var buttonClickHandler:ButtonHandler? = nil
@IBAction func buttonClick(_ sender: Any)
if buttonClickHandler != nil
self.buttonClickHandler!(self)
cell 用于tableview cellForRowAtIndexpath:
cell.buttonClickHandler = aCell in
// Do Whatever you want to do on the button click
通过使用此代码,您无需重新加载 Cell。也不需要维护它的索引路径,所有的东西都只是更新你想做的任何事情,或者需要对按钮进行任何操作,只需在设置的 cellForIndexpath 中写入即可。
以上是在行中单击单个按钮。要选择整行,您可以实现 DidSelectRow Delegate
【讨论】:
以上是关于如何在 Objective-C 和 Swift 中实现“didSelectButtonInCellAtIndexPath:”?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Swift 中调用 Objective-C 类别方法
Objective-C 观察者 - 如何在 Swift 中使用
如何在 Objective-C 和 Swift 中实现“didSelectButtonInCellAtIndexPath:”?
如何在 Swift 中使用 Objective-C #define