Обнаружение двойного и единственного нажатия на UITableViewCell для выполнения двух действий

У меня есть PFQueryTableViewController в котором я пытаюсь изучить некоторые взаимодействия tableView.

Что у меня сейчас есть: ячейка tableView увеличивает свою высоту при нажатии didSelectRowAtIndexPath или я могу в основном передать данные, связанные с ячейкой, к следующему viewController, используя performSegueWithIdentifier вместе с prepareForSegue с помощью одного крана.

В приведенном ниже коде, если я прокомментирую код "Нажмите код, чтобы увеличить высоту ячейки tableView", я могу обнаружить двойное нажатие. С другой стороны, одиночное нажатие увеличивает высоту, поскольку код находится внутри блока didSelect.

Что мне нужно: при однократном нажатии высота ячейки увеличивается или уменьшается. В то время как высота ячейки увеличивается, если я дважды коснусь, она должна передать данные ячейки к следующему UIViewController,

Если нет, то один кран должен увеличить или уменьшить высоту. И двойной тап должен передавать данные ячейки к следующему UIViewController

Код как ниже:

var selectedCellIndexPath: NSIndexPath?
var SelectedCellHeight = CGFloat() // currently set to 480.0 tableView height
var UnselectedCellHeight = CGFloat() // currently set to 300.0 tableView unselected hight
  ....

override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
    if let selectedCellIndexPath = selectedCellIndexPath {
        if selectedCellIndexPath == indexPath {
            return SelectedCellHeight
        }
    }
    return UnselectedCellHeight
}

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    var cell = tableView.dequeueReusableCellWithIdentifier("cell") as! DataViewTableViewCell!
    if cell == nil {
        cell = DataViewTableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: "cell")
    }

// Below is the double Tap gesture recognizer code in which
// The single tap is working, double tap is quite difficult to get 
// as the cell height increases on single tap of the cell

    let doubleTap = UITapGestureRecognizer()
        doubleTap.numberOfTapsRequired = 2
        doubleTap.numberOfTouchesRequired = 1
        tableView.addGestureRecognizer(doubleTap)

        let singleTap = UITapGestureRecognizer()
        singleTap.numberOfTapsRequired = 1
        singleTap.numberOfTouchesRequired = 1
        singleTap.requireGestureRecognizerToFail(doubleTap)
        tableView.addGestureRecognizer(singleTap)

// Tap code to increases height of tableView cell

    if let selectedCellIndexPath = selectedCellIndexPath {
        if selectedCellIndexPath == indexPath {
            self.selectedCellIndexPath = nil
            cell.postComment.fadeIn()
            cell.postCreatorPicture.alpha = 1
            cell.postDate.fadeIn()
          //  cell.postTime.fadeIn()
            cell.postCreator.fadeIn()
        } else {
            self.selectedCellIndexPath = indexPath
        }
    } else {
        selectedCellIndexPath = indexPath
    }
    tableView.beginUpdates()
    tableView.endUpdates()
}



func doubleTap() {
        print("Double Tap")
    }

func singleTap() {
        print("Single Tap")
    }

Другой способ, которым я могу заставить это работать, - если я могу получить NSIndexPath выбранной ячейки за пределами didSelectRowAtIndexPath код, я могу в основном использовать двойной тап для выполнения, если еще, чтобы получить требуемое действие. Можешь ли ты получить NSIndexPath за пределами блоков tableView по умолчанию?

2 ответа

Работай!

Во-первых: определите var customNSIndexPath = NSIndexPath() и добавьте приведенный ниже код внутри didSelectRowAtIndexPath кодовый блок.

customNSIndexPath = indexPath
        print(customNSIndexPath)

Второе: удалить код "Нажмите код для увеличения высоты ячейки таблицы" из didSelectRowAtIndexPath и добавить к singleTap() функция. И выполнить Segue, используя doubleTap(),

func doubleTap() {
        print("Double Tap")
        performSegueWithIdentifier("MainToPost", sender: self)
    }

    func singleTap() {
        print("Single Tap")
        var cell = tableView.dequeueReusableCellWithIdentifier("cell") as! DataViewTableViewCell!
        if cell == nil {
            cell = DataViewTableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: "cell")
        }

        if let selectedCellIndexPath = selectedCellIndexPath {
            if selectedCellIndexPath == customNSIndexPath {
                self.selectedCellIndexPath = nil

            } else {
                self.selectedCellIndexPath = customNSIndexPath
            }
        } else {
            selectedCellIndexPath = customNSIndexPath
        }
        tableView.beginUpdates()
        tableView.endUpdates()
    }

Вот так ты напортачишь, работая допоздна, не спя. Это было проще всего сделать. Спасибо

Примечание: если у кого-то есть лучшее решение или это неправильное решение в некоторых случаях, пожалуйста, оставьте комментарий. Если ваш лучше, это действительно поможет другим.

      var lastClick: TimeInterval = 0.0
var lastIndexPath: IndexPath? = nil

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
{
    let now: TimeInterval = Date().timeIntervalSince1970
    if (now - lastClick < 0.3) && (lastIndexPath?.row == indexPath.row ) {
        print("Double Tap!")
    } else {
        print("Single Tap!")
    }
    lastClick = now
    lastIndexPath = indexPath
}
Другие вопросы по тегам