Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 为什么';didSelectRowAt indexPath';功能仅在两个手指点击后运行?_Swift_Tableview - Fatal编程技术网

Swift 为什么';didSelectRowAt indexPath';功能仅在两个手指点击后运行?

Swift 为什么';didSelectRowAt indexPath';功能仅在两个手指点击后运行?,swift,tableview,Swift,Tableview,“我的表格视图”自定义单元格行有3个元素:嵌入在UIScrollView中的UITextField、标签和按钮didSelectRowAt indexPath函数仅在同时点击3行元素中的任意2行时运行。为什么会这样?我没有添加任何触摸手势 可能有用的信息:tableview委托和数据源设置为self。删除tableView.reloadData()将导致代码的更改不会反映在UI中self.tableView.beginUpdate()&self.tableView.endUpdates()无效

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

可能有用的信息:tableview委托和数据源设置为self。删除tableView.reloadData()将导致代码的更改不会反映在UI中
self.tableView.beginUpdate()
&
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()
    }
}
提前谢谢你

编辑:

因为我搞不懂,我只好用触摸手势。谢谢。

过时-请参阅已接受的答案
原始答案 我也有同样的问题,也无法解决。所以我决定添加一个轻拍手势,它也会像以前一样设置动画

在表的my
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.
用于表格单元格以获取所需内容的自定义类:

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!")
    }
}

希望有人觉得这个有用!最好避免采取变通办法,但在这种情况下,这是必需的 好吧,我终于明白了。原来

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {}
不能与现有的自定义点击手势配合使用(不确定是否仅限于点击手势或一般手势)。这意味着您不能在tableView的同时在同一视图控制器(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
        }
    }

尝试在主线程上运行此代码,通过向UIExtField和UIButton提供“isUserInteractionEnabled=false”来禁用触摸事件。@JarvisTheAvenger我该怎么做?@AshokPolu,谢谢你的推荐,但是没有用。还有其他建议吗?我想你应该先通过禁用UI元素用户交互来尝试一下。@MansurAhmed也有同样的问题,你找到了吗?我找到了为什么didSelectRowAt函数对我不起作用的原因。请参阅下面我的答案,了解无需添加额外点击手势的解决方案。希望有帮助!另外,如果更改了,请确保删除
allowssection=false
!现在我的桌面视图和点击手势都可以同时工作,当它们应该被禁用时,它们可以同时工作。我想你应该一次只做一个轻拍动作。
for gesture in (self.view?.gestureRecognizers)! {
        if gesture.isKind(of: UITapGestureRecognizer.self) {
            gesture.isEnabled = false // or true if you want to enable it
        }
    }