如何将 UIResponder 放在 Gesturer Recognizer 之前
How can I put UIResponder prior to Gesturer Recognizer
我试图做的是让用户 select 一行并在另一个文本字段中检索其中的单元格内容,以通过识别长按而不是单击来同时编辑。
问题是长按识别器在 table 视图的委托处理程序响应 select 行之前进行。因此,每次 selected 行的内容在长按结束后出现,最终文本字段接收先前 selected 行的内容,而不是预期的当前 'press' 行。
如何在长按被识别之前制作一行 selected?
这是代码,table视图中包含 3 个水果的列表。我的期望是当用户按下一行足够长的时间时,table 视图首先被点击并将 selectedFruit 设置为按下行中的水果名称,而不是在长按结束后。
class TableViewController: UITableViewController {
let contentList = ["apple", "blackberry","orange"]
@IBOutlet weak var selectedItem: UILabel!
var selectedFruit:String?
override func viewDidLoad() {
super.viewDidLoad()
let longPressRecognizer = UILongPressGestureRecognizer(target: self, action: #selector(longPressHandler(_:)))
longPressRecognizer.numberOfTouchesRequired = 1
longPressRecognizer.allowableMovement = 10
longPressRecognizer.minimumPressDuration = 0.5
self.view.addGestureRecognizer(longPressRecognizer)
}
// MARK: - Table view data source
override func numberOfSections(in tableView: UITableView) -> Int {
// #warning Incomplete implementation, return the number of sections
return 1
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
// #warning Incomplete implementation, return the number of rows
return contentList.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "contentItem", for: indexPath)
cell.textLabel?.text = contentList[indexPath.row]
return cell
}
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
selectedFruit = contentList[indexPath.row]
}
@objc func longPressHandler(_ sender:UILongPressGestureRecognizer) {
selectedItem.text = selectedFruit ?? ""
}
}
读取 UILongPressGestureRecognizer 的位置,确定哪一行在该位置(最近?),并设置选中的行。
let pressLocation = sender.location(in: tableView)
if let indexPath = tableView.indexPathForRow(at: pressLocation) {
tableView.selectRow(at: indexPath, animated: false, scrollPosition: .none)
selectedItem.text = contentList[indexPath.row]
}
我试图做的是让用户 select 一行并在另一个文本字段中检索其中的单元格内容,以通过识别长按而不是单击来同时编辑。
问题是长按识别器在 table 视图的委托处理程序响应 select 行之前进行。因此,每次 selected 行的内容在长按结束后出现,最终文本字段接收先前 selected 行的内容,而不是预期的当前 'press' 行。
如何在长按被识别之前制作一行 selected?
这是代码,table视图中包含 3 个水果的列表。我的期望是当用户按下一行足够长的时间时,table 视图首先被点击并将 selectedFruit 设置为按下行中的水果名称,而不是在长按结束后。
class TableViewController: UITableViewController {
let contentList = ["apple", "blackberry","orange"]
@IBOutlet weak var selectedItem: UILabel!
var selectedFruit:String?
override func viewDidLoad() {
super.viewDidLoad()
let longPressRecognizer = UILongPressGestureRecognizer(target: self, action: #selector(longPressHandler(_:)))
longPressRecognizer.numberOfTouchesRequired = 1
longPressRecognizer.allowableMovement = 10
longPressRecognizer.minimumPressDuration = 0.5
self.view.addGestureRecognizer(longPressRecognizer)
}
// MARK: - Table view data source
override func numberOfSections(in tableView: UITableView) -> Int {
// #warning Incomplete implementation, return the number of sections
return 1
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
// #warning Incomplete implementation, return the number of rows
return contentList.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "contentItem", for: indexPath)
cell.textLabel?.text = contentList[indexPath.row]
return cell
}
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
selectedFruit = contentList[indexPath.row]
}
@objc func longPressHandler(_ sender:UILongPressGestureRecognizer) {
selectedItem.text = selectedFruit ?? ""
}
}
读取 UILongPressGestureRecognizer 的位置,确定哪一行在该位置(最近?),并设置选中的行。
let pressLocation = sender.location(in: tableView)
if let indexPath = tableView.indexPathForRow(at: pressLocation) {
tableView.selectRow(at: indexPath, animated: false, scrollPosition: .none)
selectedItem.text = contentList[indexPath.row]
}