didSelectRowAt 仅在多点触控时调用

didSelectRowAt called only on multitouch

什么可以让UITableViewCell只检测多点触控?如果我用一根手指点击它不会调用 didSelectRowAtIndex

这是我的代码:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "bookingSettingsCell", for: indexPath) as! SettingsTableViewCell
    if indexPath.row < 3 {
        cell.settingSwitch.removeFromSuperview()
    }
    cell.settingTitle.text = dataForSetting[indexPath.row].first
    if dataForSetting[indexPath.row].last != "Pencil" {
        cell.settingValue.isHidden = true
        cell.settingChangable.isHidden = true
        cell.settingSwitch.isHidden = false
    }
    return cell
}

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    DispatchQueue.main.async(execute: {
        if indexPath.row < 3 {
            let destinationVC = self.storyboard?.instantiateViewController(withIdentifier: "DatePicker") as! DatePickerViewController
            destinationVC.modalPresentationStyle = .overCurrentContext
            destinationVC.delegate = self
            self.present(destinationVC, animated: true, completion: nil)
        }
    })
}

UITableViewCell class:

class SettingsTableViewCell: UITableViewCell {
@IBOutlet var settingTitle: UILabel!
@IBOutlet var settingChangable: UIImageView!
@IBOutlet var settingValue: UILabel!
@IBOutlet var settingSwitch: UISwitch!

    override func awakeFromNib() {
        super.awakeFromNib()
        settingSwitch.transform = CGAffineTransform(scaleX: 0.65, y: 0.60)
    }
}

我认为问题不在 didSelectRowAt 中,而是在 UITableViewCell 中... 你在设计 xib 时是否使用了约束逻辑? 某些对象(标签或 imageView)可能会产生触摸问题...... 检查您的约束或直接在故事板的 uitableView 中设计您的 tableViewCell。

我发现发生这种情况是因为我将 UITapGestureRecognizer 添加到我的超级视图中,这样我就可以在触摸时隐藏键盘。但实际上仍然不明白为什么在这种情况下它与多点触控一起工作?我建议我的错误应该阻止所有点击事件。

您可以在实现手势识别器的委托方法后处理 uitableviews's didSelectRowAt 方法的行为。这可以防止 uiviewtableViewCell 之间点击的未定义行为,并保留触摸记录。

UIGestureRecognizerDelegate 方法:

func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldReceiveTouch touch: UITouch) -> Bool {
    println("in shouldReceiveTouch")
    gestureRecognizer.delegate = self
    if (touch.view == tableView){
        println("touching tableView list")
        return false
    }
    else{
        println("touching elsewhere")
        return true
    }
}

您可以通过在 class 中添加 UIGesture 识别器委托 来解决这个问题。在 class 中添加 UIGestureRecognizerDelegate。请按照以下步骤操作:-

/*

class SignupInstructorViewController: UIViewController, UIGestureRecognizerDelegate

注意:-现在确定您是在点击 tableView 还是其他地方,您必须像这样实现此手势委托。

//MARK:- 手势代表

func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldReceiveTouch touch: UITouch) -> Bool {
    // if user touch the tableview then below condition will be true
    if touch.view != nil && (touch.view!.isDescendantOfView(tableViewName)) {
        return false
    }
    return true
}

希望对你有用。

提前致谢。

*/

您可以通过删除视图的所有手势来检查是否由于任何手势而发生这种情况,然后尝试。

view.gestureRecognizers?.removeAll()

最好找到导致问题的确切手势并妥善处理。