为什么“ didSelectRowAt indexPath”功能仅在两指点击之后运行?

时间:2019-02-07 03:36:09

标签: swift tableview

我的表格视图自定义单元格行包含3个元素:嵌入在UIScrollView中的UITextField,标签和按钮。 “ didSelectRowAt indexPath”功能仅在同时点击3行元素中的任意2行时运行。为什么是这样?我没有添加任何触摸手势。

可能有用的信息:tableview委托和dataSource设置为self。删除tableView.reloadData()将导致代码更改未反映在UI中。 self.tableView.beginUpdates()self.tableView.endUpdates()无效。

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    print("test")
    if dataSource.data[indexPath.row].isDataCollapsed() {
        print("expanded")
        dataSource.data[indexPath.row].isCollapsed = false
        tableView.reloadData()
    }
}

提前谢谢!

编辑:

由于无法弄清,我求助于使用触摸手势。谢谢。

2 个答案:

答案 0 :(得分:2)

好,所以我终于弄明白了。事实证明

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {}

不能与现有的自定义轻击手势配合使用(不确定是否仅限于轻击手势或一般而言)。这意味着您不能与tableView同时在同一View Controller(VC)中激活轻击手势,否则您的didSelectRowAt函数将无法正确响应触摸。

我为此提出了两种解决方案。一种解决方法是:添加一个自定义的点击手势,就像我之前所做的那样,并按照上面@George_E的回答所示(或取决于您的用例),使您的tableView响应DidSelectRowAt。或者,您可以使用tableView活动在视图中处理其他现有的自定义点击手势。通过这种方式,我的意思是当您的tableView处于活动状态并且需要一些点击手势交互时,请禁用自定义点击手势。相反,当tableView处于非活动状态或不需要点击手势交互时,请重新启用您的自定义点击手势。将以下代码放置在要禁用/启用自定义点击手势的任何位置:

for gesture in (self.view?.gestureRecognizers)! {
        if gesture.isKind(of: UITapGestureRecognizer.self) {
            gesture.isEnabled = false // or true if you want to enable it
        }
    }

答案 1 :(得分:0)

已过时-查看已接受的答案


原始答案

我遇到了同样的问题,也无法解决。因此,我决定添加一个点击手势,该手势也像以前一样动画。

在表的didMoveToSuperview中:

// Set delegates
delegate = self
dataSource = self

// Setup cells
register(MyCustomTableCell.self, forCellReuseIdentifier: "cellId")
allowsSelection = false // <-- Stops the user from tapping with 2
                        //     fingers, creating a permanent selection.

在表格视图中用于设置单元格的函数(请记住,下面的自定义类将其初始化):

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    // Create cell
      let cell = MyCustomTableCell(style: UITableViewCell.CellStyle.value1, reuseIdentifier: "cellId")
     /* OR */
      let cell = dequeueReusableCell(withIdentifier: "cellId")

    // Setup cell
    /* ... */

用于表格单元格以获取我们想要的自定义类:

final class MyCustomTableCell: UITableViewCell {

    override func didMoveToSuperview() {
        // Create the tap gesture
        let gesture = UITapGestureRecognizer(target: self, action: #selector(tapGesture(gesture:)))
        addGestureRecognizer(gesture)
    }

    @objc private func tapGesture(gesture: UITapGestureRecognizer) {
        setSelected(true, animated: true)
        setSelected(false, animated: true)
        print("Tap!")
    }
}

希望有人觉得这很有用!最好避免解决方法,但是在这种情况下是必需的。