didSelectRowAt

问题描述

我正在尝试对我的 tableviwe 执行长按手势。我已经用 Timer 实现了双击。我找到了一个有用的答案,但不知道为什么它根本不起作用。

我需要在我的表格中同时长按和双击。

我正在尝试使用 LongPres 和 obj-c 函数来实现。也许可以在 didSelectRowAt 中以某种方式做到这一点。

这个问题可能是由 swift 4 和 swift 5 之间的一些错误连接引起的。

import UIKit

class TeamsVC: UIViewController,UITableViewDelegate,UITableViewDataSource {
   
    var tapCount:Int = 0
    var tapTimer:Timer?
    var tappedRow:Int?
    let longPress = UILongPressGestureRecognizer(target: self,action: #selector(longpress))
    
    @IBOutlet weak var plusBtn: UIButton!
    @IBOutlet weak var teamsTable: UITableView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        teamsTable.delegate = self
        teamsTable.dataSource = self
        teamsTable.rowHeight = 55
        teamsTable.isScrollEnabled = false
        teamsTable.backgroundColor = nil
        teamsTable.separatorStyle = .none
        
        teamsTable.addGestureRecognizer(longPress)
    }
    
// MARK: - TableView
    
   
    
    func tableView(_ tableView: UITableView,numberOfRowsInSection section: Int) -> Int {
        return teams.count
    }
    
    func tableView(_ tableView: UITableView,cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        if let cell = tableView.dequeueReusableCell(withIdentifier: "TeamsCell") as? TeamsCell {
            cell.updateCell(team: teams[indexPath.row])
            cell.teamsCellDelegate = self
            cell.deleteButtonShowHide()

            return cell
        }
        return UITableViewCell()
    }
    
    func tableView(_ tableView: UITableView,didSelectRowAt indexPath: IndexPath) {
        //debugPrint("Checking for double taps here")
          if(tapCount == 1 && tapTimer != nil && tappedRow == indexPath.row){
              //debugPrint("double tap - Put your double tap code here")
            teams[indexPath.row].name = chooseTeamName()
            teamsTable.reloadData()
              tapTimer?.invalidate()
              tapTimer = nil
              tapCount = 0
          }
          else if(tapCount == 0){
            //debugPrint("This is the first tap. If there is no tap till tapTimer is fired,it is a single tap")
              tapCount = tapCount + 1;
              tappedRow = indexPath.row;
            tapTimer = Timer.scheduledTimer(timeInterval: 0.4,target: self,selector: #selector (tapTimerFired),userInfo: nil,repeats: false)
          }
          else if(tappedRow != indexPath.row){
            //debugPrint("Tap on new row")
              tapCount = 0;
              if(tapTimer != nil){
                  tapTimer?.invalidate()
                  tapTimer = nil
              }
          }
      }
    
     @objc func tapTimerFired(aTimer:Timer){
            //debugPrint("Timer fired,there was a single tap on indexPath.row = tappedRow")
          if(tapTimer != nil){
              tapCount = 0;
              tappedRow = -1;
          }
    }
    
    @objc func longpress(sender: UILongPressGestureRecognizer) {

                if sender.state == UIGestureRecognizer.State.began {
                    let touchPoint = sender.location(in: teamsTable)
                    if let indexPath = teamsTable.indexPathForRow(at: touchPoint) {
                        //Action 
                        print("Long press pressed")
                    }
                }

            }
    
// MARK: - plusBtn
    @IBAction func plusBtnTapped(_ sender: Any) {
        plusBtnHide()
        addTeam()
        teamsTable.reloadData()
        print(teams)
    }
    
    func plusBtnShow() {
        if teams.count < 5 {plusBtn.isHidden = false}
    }
    
    func plusBtnHide() {
        if teams.count == 4 { plusBtn.isHidden = true}
    }


}
    // MARK: - Extension
extension TeamsVC: TeamsCellDelegate {
    func deleteCell() {
        self.teamsTable.reloadData()
        self.plusBtnShow()
    }
}

解决方法

我找到了答案!

let longPress = UILongPressGestureRecognizer(target: self,action: #selector(longpress))

应该移到 viewDidLoad