didSelectRow仅在多点触控时调用

时间:2016-10-01 12:03:38

标签: ios swift uitableview didselectrowatindexpath

什么可以使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 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)
    }
}

5 个答案:

答案 0 :(得分:2)

在实现手势识别器的委托方法之后,您可以处理didSelectRowAt uiview方法的行为。这可以防止tableViewCellfunc 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 } } 之间的抽头未定义的行为,并保留触摸记录。

UIGestureRecognizerDelegate方法:

app.controller('CustSignupCtrl', ['$scope', '$filter', 'frontendService', '$http', 'editableOptions', 'editableThemes','notify','notification','$appConstants',
  function($scope, $filter, frontendService, $http, editableOptions, editableThemes, notify, notification, $appConstants){

    $scope.pw1 = '';
});

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

您可以在班级中添加 UIGesture识别代理来解决此问题。在您的课程中添加 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
}

HopeFully,它适合你。

先谢谢。

* /

答案 4 :(得分:0)

您可以通过删除视图的所有手势来检查这是否由于任何手势而发生,如下所示并尝试。

view.gestureRecognizers?.removeAll()

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