【问题标题】:How to make didSelectRowAt IndexPath work with custom delegate如何使 didSelectRowAt IndexPath 与自定义委托一起使用
【发布时间】: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',为什么我会收到错误?否则谢谢它现在有效。这就是为什么我不明白其他人的原因,因为我觉得我已经尝试过了。

标签: swift uitableview swift3 didselectrowatindexpath


【解决方案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 返回单元格}。如果我误解了,请在您的问题中附上更多信息,以便我提供帮助:)
  • 添加了解释以便更好地理解我的问题:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-20
  • 1970-01-01
  • 2010-10-09
  • 2017-04-16
  • 2011-03-23
相关资源
最近更新 更多