Обнаружение двойного и единственного нажатия на 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
}