在 table 视图单元格中使用 UILongPressGestureRecognizer 时出现问题
Issue with UILongPressGestureRecognizer while using it in table view cell
我正在通过 swift3 中的故事板在 uitableview 中实现长按。我在故事板中只有一个原型单元集。但问题是长按仅在第一个单元格中被检测到。其余细胞不听长按手势。
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 10
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
let row = indexPath.row
cell.textLabel?.text = "Label"
return cell
}
@IBAction func longPress(_ guesture: UILongPressGestureRecognizer) {
if guesture.state == UIGestureRecognizerState.began {
print("Long Press")
}
}
控制台中显示的警告是:
这在过去是不允许的,现在是强制执行的。从 iOS 9.0 开始,它将被放在第一个加载到的视图中。
您需要为 cellForRowAtIndexPath 中的所有单元格添加手势
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
let row = indexPath.row
cell.textLabel?.text = "Label"
let longPressRecognizer = UILongPressGestureRecognizer(target: self, action: #selector(HomeViewController.longPress(_:)))
cell?.addGestureRecognizer(longPressRecognizer)
return cell
}
func longPress(_ guesture: UILongPressGestureRecognizer) {
if guesture.state == UIGestureRecognizerState.began {
print("Long Press")
}
}
将手势附加到 tableview,并在触发手势时找出选择了哪个 indexPath。
override func viewDidLoad() {
super.viewDidLoad()
let longPressRecognizer = UILongPressGestureRecognizer(target: self, action: #selector(self.longPress(_:)))
tableView?.addGestureRecognizer(longPressRecognizer)
}
func longPress(_ guesture: UILongPressGestureRecognizer) {
if guesture.state == UIGestureRecognizerState.began {
let point = guesture.location(in: tableView)
let indexPath = tableView.indexPathForRow(at: point);
print("Long Press \(String(describing: indexPath))")
}
}
因为 tableview 是一种滚动视图,所以最好将手势附加到 tableview 本身而不是它的任何子视图。这样就不太可能干扰必须跟踪的其他手势。
我正在通过 swift3 中的故事板在 uitableview 中实现长按。我在故事板中只有一个原型单元集。但问题是长按仅在第一个单元格中被检测到。其余细胞不听长按手势。
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 10
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
let row = indexPath.row
cell.textLabel?.text = "Label"
return cell
}
@IBAction func longPress(_ guesture: UILongPressGestureRecognizer) {
if guesture.state == UIGestureRecognizerState.began {
print("Long Press")
}
}
控制台中显示的警告是:
这在过去是不允许的,现在是强制执行的。从 iOS 9.0 开始,它将被放在第一个加载到的视图中。
您需要为 cellForRowAtIndexPath 中的所有单元格添加手势
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
let row = indexPath.row
cell.textLabel?.text = "Label"
let longPressRecognizer = UILongPressGestureRecognizer(target: self, action: #selector(HomeViewController.longPress(_:)))
cell?.addGestureRecognizer(longPressRecognizer)
return cell
}
func longPress(_ guesture: UILongPressGestureRecognizer) {
if guesture.state == UIGestureRecognizerState.began {
print("Long Press")
}
}
将手势附加到 tableview,并在触发手势时找出选择了哪个 indexPath。
override func viewDidLoad() {
super.viewDidLoad()
let longPressRecognizer = UILongPressGestureRecognizer(target: self, action: #selector(self.longPress(_:)))
tableView?.addGestureRecognizer(longPressRecognizer)
}
func longPress(_ guesture: UILongPressGestureRecognizer) {
if guesture.state == UIGestureRecognizerState.began {
let point = guesture.location(in: tableView)
let indexPath = tableView.indexPathForRow(at: point);
print("Long Press \(String(describing: indexPath))")
}
}
因为 tableview 是一种滚动视图,所以最好将手势附加到 tableview 本身而不是它的任何子视图。这样就不太可能干扰必须跟踪的其他手势。