如何将 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]
}