如何在 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 可以用来指示哪个单元格负责该操作,不要忘记,您应该将索引路径存储在UITableViewDataSourcecellForRowAtIndex 上,并在自定义单元格上具有适当的属性。

    创建具有您在协议中的问题中所说的功能的自定义协议,制作您的视图控制器或视图模型或您用作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

如何在 iOS 应用程序的同一个项目中集成 Objective-C 和 Swift pod

如何在 Objective-C 中使用 Swift 文件?