swift 为什么我的代码选择下一个单元格?- UILongPressGestureRecognizer

ghg1uchk  于 2023-04-19  发布在  Swift
关注(0)|答案(2)|浏览(92)

我正在尝试创建一种方法来选择一个单元格,以便我可以编辑它。使用当前代码,向上的单元格总是下一个单元格。并且我的tableView中的最后一个单元格不能被选择。

@objc func handleLongPress(_ longPressGestureRecognizer: UILongPressGestureRecognizer) {
    if longPressGestureRecognizer.state == UIGestureRecognizerState.began {
        let touchPoint = longPressGestureRecognizer.location( in : self.view)
        if let indexPath = tableView.indexPathForRow(at: touchPoint) {
            let context = (UIApplication.shared.delegate as!AppDelegate).persistentContainer.viewContext
            let cell_selected = classements[indexPath.row]
            nomAjouterOutlet.text = cell_selected.nom
            pointAjouterOutlet.text = "\(cell_selected.point)"
            classeAjouterOutlet.text = cell_selected.classe!
            // Context CoreData
            context.delete(cell_selected)
            (UIApplication.shared.delegate as!AppDelegate).saveContext()
            do {
                classements =
                try context.fetch(Tournoi.fetchRequest())
            } catch {
                print("Fetching Failed")
            }
            classementTableView.reloadData()
        }
    }
}
override func viewDidLoad() {
    super.viewDidLoad()
    let longPressGesture: UILongPressGestureRecognizer = UILongPressGestureRecognizer(target: self, action: #selector(ClassementViewController.handleLongPress(_: )))
    longPressGesture.minimumPressDuration = 1.0
    longPressGesture.delegate = self
    self.tableView.addGestureRecognizer(longPressGesture)
}
ozxc1zmp

ozxc1zmp1#

我发现了我的错误。下面是有效的代码。
Swift 4

override func viewDidLoad() {
    super.viewDidLoad()
    setupLongPressGesture()
}

func setupLongPressGesture() {
    let longPressGesture:UILongPressGestureRecognizer = UILongPressGestureRecognizer(target: self, action: #selector(self.handleLongPress))
    longPressGesture.minimumPressDuration = 1.0 // 1 second press
    longPressGesture.delegate = self
    self.tblMessage.addGestureRecognizer(longPressGesture)
}

@objc func handleLongPress(_ gestureRecognizer: UILongPressGestureRecognizer){
    if gestureRecognizer.state == .ended {
        let touchPoint = gestureRecognizer.location(in: self.tblMessage)
        if let indexPath = tblMessage.indexPathForRow(at: touchPoint) {

        }
    }
}

来自shareedit回答了Jan 18 11:05
PinkeshGjr 1,28121225

nnvyjq4y

nnvyjq4y2#

由于OP的回答没有足够的解释,我想添加这个答案作为OP答案的补充答案。错误实际上是在以下代码中:

let touchPoint = longPressGestureRecognizer.location( in : self.view)

由于该位置是从主view内获得的,返回的触摸点是相对于view的。然而,viewtblMessagey点之间存在差异,导致所选单元格向下移动。这可能是由于view内的导航条导致y point的这种移动。如果导航ba的高度是已知的,我们可以通过将差值应用于touchPointy属性(如touchpoint.y -= navBarHeight)来获得正确的触摸点。
因此,获取触摸点的适当方法是使用tableView作为偏移量,以便location(in:)函数可以正确计算触摸点。最终,当我们将location(in:)的参数从view替换为tblMessage(tableView本身)时,我们应该得到正确的点。

let touchPoint = gestureRecognizer.location(in: self.tblMessage)

相关问题