如何检测UITableView上的触摸,到目前为止似乎没有任何工作?

时间:2015-03-08 00:26:36

标签: ios uitableview swift touch

如何检测UITableView上的触摸?我尝试了thread中的解决方案。我的tableViewscrollView在同一个UIViewController中有约束,因此将tableView子类化很复杂。
触摸方法不会被调用:

class ViewController: UIViewController, UIScrollViewDelegate, UITableViewDataSource, UITableViewDelegate {

    @IBOutlet weak var verticalSpacing: NSLayoutConstraint!
    @IBOutlet weak var scrollView: UIScrollView!
    @IBOutlet weak var tableView: UITableView!


override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
    super.touchesBegan(touches, withEvent: event)
    println("touch began")
}
override func touchesMoved(touches: NSSet, withEvent event: UIEvent) {
    super.touchesMoved(touches, withEvent: event)
}
override func touchesEnded(touches: NSSet, withEvent event: UIEvent) {
    super.touchesEnded(touches, withEvent: event)
    println("touch ended")
}
override func touchesCancelled(touches: NSSet!, withEvent event: UIEvent!) {
    super.touchesCancelled(touches, withEvent: event)
}

我补充说:

tableView.userInteractionEnabled = true
tableView.canCancelContentTouches = false //or true is the same

但它并没有改变任何事情。 scrollViewtableView同时可见,但它们不重叠。

5 个答案:

答案 0 :(得分:9)

不需要子类化!

只需添加一个手势识别器,并确保包含对cancelsTouchesInView

的调用

这是Swift版本:

override func viewDidLoad() {
    super.viewDidLoad()
    view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: "handleTap:"))
}

func handleTap(sender: UITapGestureRecognizer) {
    if sender.state == .Ended {
        // Do your thang here!
    }
    sender.cancelsTouchesInView = false
}

享受!

答案 1 :(得分:2)

使用UITableView检测滚动视图的更改时,有一些方法非常有用。这些可能对你有用。

例如,

override func scrollViewDidEndDecelerating(scrollView: UIScrollView) {
    println("Ended decelerating")
}

override func scrollViewDidEndDragging(scrollView: UIScrollView, willDecelerate decelerate: Bool) {
    println("Ended dragging")
}

答案 2 :(得分:1)

您的问题是,touchesBegan等也是来自UIView的方法,因此您需要子类化UITableView或使用TapGestureRecognizer使其按您需要的方式工作。< / p>

UITableView子类化为不应该太复杂,因为您可以将UITableView类设置为Storyboard中tableView的类,就像使用UIViewControllers等一样。

答案 3 :(得分:0)

您是否尝试调整delaysContentTouches?可能是如果你按下足够长的时间,你的触摸会以默认延迟注册。

不得不问,是否有理由不能只使用didSelectRowAtIndexPath

答案 4 :(得分:0)

迟到聚会了,但是我需要检测桌子上的触摸 不轻按 ,所以我对此感到很沮丧:

fileprivate class TouchSensitiveTableView: UITableView {

    fileprivate var onTouchStart: (() -> ())? = nil
    fileprivate var onTouchEnd: (() -> ())? = nil

    public override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        self.onTouchStart?()
    }

    public override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
        self.onTouchEnd?()
    }
}

然后像这样使用

private let tableView = TouchSensitiveTableView()

viewDidLoad() {
    ....
    self.tableView.onTouchStart = {[weak self] in .... }
    self.tableView.onTouchEnd = {[weak self] in .... }

与表格的滚动有较小的交互作用,但不是主要的。