有些SO post但与我的情况无关。
touchesBegan(:)
在tableview/scrollview.
UITableView
或UIScrollView
上不起作用,将消耗所有触摸事件,并且不会传递给下一个响应者。我有一个基本视图控制器,我想将触摸事件接收到基本控制器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占据了总视图的一半。
答案 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
)上退出键盘。