touchesBegan(:)无法在表格视图/滚动视图上运行

时间:2018-07-04 05:24:36

标签: ios swift uitableview events touch

有些SO post但与我的情况无关。

touchesBegan(:)tableview/scrollview. UITableViewUIScrollView上不起作用,将消耗所有触摸事件,并且不会传递给下一个响应者。我有一个基本视图控制器,我想将触摸事件接收到基本控制器touchesBegan(:).中,在某些子视图控制器(扩展了基本视图控制器)中,我使用了tableView。当我碰触tableView时,它的使用情况以及基本控制器touchesBegan(:).中没有收到任何事件?

我希望首先将触摸接收到基本控制器touchesBegan(:)中。然后有条件地,我想允许子视图控制器tableView来使用它或不使用它。

import UIKit

class ItemCell: UITableViewCell {

    @IBOutlet weak var title: UILabel!
}

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

    @IBOutlet weak var tableView: UITableView!

    override func viewDidLoad() {
        super.viewDidLoad()

        self.tableView.delegate = self
        self.tableView.dataSource = self
    }

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        print("Touches began!")
    }

    func numberOfSections(in tableView: UITableView) -> Int { return 1 }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return 10 }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell =  tableView.dequeueReusableCell(withIdentifier: "ItemCell", for: indexPath) as! ItemCell
        cell.title?.text = "Click me"
        return cell
    }
}

在上面的代码中,当我触摸表格外的视图时,将调用print(“ Touches starts!”)。但是,当我触摸桌子内部时,我仍然希望打印照片(“触摸开始!”)。假设tableview占据了总视图的一半。

2 个答案:

答案 0 :(得分:1)

func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    <#code#>
}

以上方法用于检测触摸。
如果要检测触摸表视图,则首先创建表视图的一个子类,然后将表视图分配给该类,然后将上述方法写入表视图子类。在tableview子类中,您可以检测到触摸,并且上述方法将调用。

仅测试tblview.isUserInteractionEnabled = false并检查您的viewcontroller touchesBegan方法将调用。

如下更新您的课程文件。

 class ItemCell: UITableViewCell {

    @IBOutlet weak var title: UILabel!
}

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, touchedTableviewTouchDelegate {

    @IBOutlet weak var tableView: touchedTableview!

    override func viewDidLoad() {
        super.viewDidLoad()

        self.tableView.delegate = self
        self.tableView.dataSource = self
        self.tableView.touchedTableviewdelegate = self
    }

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        print("Touches began!")
    }

    func numberOfSections(in tableView: UITableView) -> Int { return 1 }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return 10 }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell =  tableView.dequeueReusableCell(withIdentifier: "ItemCell", for: indexPath) as! ItemCell
        cell.title?.text = "Click me"
        return cell
    }

    func touchesBegunInTableview(_ touches: Set<UITouch>, with event: UIEvent?) {
        //Here You can do any thing with touch
    }
}

protocol touchedTableviewTouchDelegate: class {
    func touchesBegunInTableview(_ touches: Set<UITouch>, with event: UIEvent?)
}

class touchedTableview: UITableView
{
    var touchedTableviewdelegate: touchedTableviewTouchDelegate?

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

}

答案 1 :(得分:1)

我在代码库中遇到了同样的问题。接触开始对我不起作用,因为我们拥有动态的UI组件,而且我无法为所有组件制定逻辑。所以我用两件事来解决这个问题

1。viewDidLoad() -> tableView.keyboardDismissMode = .Drag

2。tableViewCell选择方法(didSelectRowForIndexPath)上退出键盘。