我的表格视图自定义单元格行包含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()
}
}
提前谢谢!
编辑:
由于无法弄清,我求助于使用触摸手势。谢谢。
答案 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!")
}
}
希望有人觉得这很有用!最好避免解决方法,但是在这种情况下是必需的。