如何使 didSelectRowAt IndexPath 与自定义委托一起使用

Posted

技术标签:

【中文标题】如何使 didSelectRowAt IndexPath 与自定义委托一起使用【英文标题】:How to make didSelectRowAt IndexPath work with custom delegate 【发布时间】:2018-02-16 01:32:04 【问题描述】:

好的,所以我有一个带有UITableView 的 ViewController。在继续编码之前,我读到为了从按钮获取操作或拥有自定义单元格,您可以使用标签或使用协议和委托的更清洁的解决方案。显然我选择了后者。

现在,当我在我的班级 ViewController 中使用称为 TableViewCellsDelegate 的自定义 UITableViewCell 时,我需要在下面的代码中将其替换为 UITableViewDelegate,如您所见:

class ViewController: UIViewController , UITableViewDataSource, TableViewCellsDelegate ....

我的问题是我现在没有调用这个函数:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
    print("in here")
    if indexPath.row == 0 
        if dateCellExpanded 
            dateCellExpanded = false
         else 
            dateCellExpanded = true
        
        tableView.beginUpdates()
        tableView.endUpdates()
    

我怀疑如果您选择自定义 UITableViewCell 会丢失一些委托功能。必须有一些解决方案。这是我的TableViewCellsDelegate

protocol TableViewCellsDelegate : class 
    func bookTapped(_ sender: UIButton)
    func unbookTapped(_ sender: UIButton)


    class TableViewCells: UITableViewCell 


        @IBOutlet var bookButtonProperties: UIButton!

        @IBOutlet var unbookButtonProperties: UIButton!

        @IBOutlet var nameField: UITextField!
        @IBOutlet var numberField: UITextField!

        weak var delegate: TableViewCellsDelegate?

        @IBAction func bookPressed(_ sender: UIButton) 
            delegate?.bookTapped(sender)
        

       @IBAction func unbookPressed(_ sender: UIButton) 
            delegate?.unbookTapped(sender)
        
    

【问题讨论】:

tableView(_:didSelectRowAt:)UITableViewDelegate 的一个方法。因此,您需要遵守 UITableViewDelegate 才能在 tableView(_:didSelectRowAt:) 内部进行回调 didSelectRowAt 将在您选择单元格时被调用,但在您的情况下,您有像 UIButtonUITextField 这样的控件,它们派生自 UIControl,这意味着当您点击这些控件时控制您的水龙头不会进入单元格,这会导致tableView(_:didSelectRowAt:) 未被调用。另一方面,UITableView 委托可能未正确设置为viewController 这不是@deoKasuhal 的情况,正如我所说的,当我将我的“ViewController”从 TableViewCellsDelegate 更改为 UITableViewDelegate 时,然后调用了 didSelect(你提到的所有插座都还在)。所以我知道我需要 UITableViewDelegate 但是我正在寻找解决这个问题的方法还是我必须改造我的编码 @TimoCengiz,UITableViewDelegateUITableView 关联,TableViewCellsDelegateUITableViewCell 关联。委托的代码应该设置为ViewController,一个使用UITableView,另一个使用UITableViewCell in cellForRowAtIndexPath。查看代码缺少一件事,即您没有将UITableViewDelegate 扩展到您的viewController。 class ViewController: UIViewController , UITableViewDataSource, TableViewCellsDelegate, UITableViewDelegate @deoKasuhal 好的,所以我很生气。我记得尝试输入“UITableViewDelegate”,但出现错误,所以我认为这是不可能的。当我读到你的推荐时,我觉得'UITableViewDelegate' 的位置很重要。如果我输入的顺序是:'UIViewController,'UITableViewDataSource','UITableViewDelegate','TableViewCellsDelegate',为什么我会收到错误?否则谢谢它现在有效。这就是为什么我不明白其他人的原因,因为我觉得我已经尝试过了。 【参考方案1】:

您需要使用 UITableViewDelegate 代替 TableViewCellsDelegate 来处理 didSelectRowAt。

如果您有任何问题,请给我回电。

【讨论】:

我确实明白我需要做什么。你能再解释一下吗? 当然,didSelectRowAt 是 tableView 的委托,而不是 UITableViewCell,因此您需要在 viewController 中实现 tableview 时添加 UITableViewDelegate 和 UITableViewDataSource,您可以阅读有关这两个链接的更多信息developer.apple.com/documentation/uikit/uitableviewdelegate @ 987654322@ 是的,我知道这一点。我的问题是,如果我使用的是自定义 UITableViewCell 这使我无法将 UITableViewDelegate 放在那里,我该如何解决? Uitableviewdelegate 需要在 UITableViewCell 类型的类而不是 ViewController 中实现,ViewController 将与 tableView 一起使用。 class CustomTableCellClass: UITableViewCell, UITextViewDelegate ... in tableView 代表 func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell let cell = tableView.dequeReusableCellWithIdentifier("customCell", forIndexPath: indexPath) as! CustomTableCellClass 返回单元格。如果我误解了,请在您的问题中附上更多信息,以便我提供帮助:) 添加了解释以便更好地理解我的问题:)

以上是关于如何使 didSelectRowAt IndexPath 与自定义委托一起使用的主要内容,如果未能解决你的问题,请参考以下文章

didSelectRowAt 更改所有行中的值

用户在 didSelectRowAt 方法中选择原始数据后如何显示视图控制器 4 秒

为自定义单元格调用 didSelectRowAt 索引

如何在 swift 中从情节提要中的 didSelectRowAt indexPath 打开视图标签栏控制器?

无法让 didSelectRowAt 为 TableView 工作

didSelectRowAt 不适用于我的 UITableViewController