Проведите пальцем, чтобы поставить лайк на UITableViewCell, не работающем должным образом - Swift

Я использую UISwipeGestureRecognizer для обнаружения пролистывания ячейки в UITableViewCell, аналогично ЭТА ССЫЛКА, которая позволит пользователю поставить «Нравится» фотографии.

Проблема в том, что я не совсем понимаю, как изменить значение Like для этого конкретного сообщения, и у него нет indexPath, как у других «встроенных» методов. Я также не понимаю, как он знает, как использовать ячейку, которая отображается преимущественно на экране, поскольку может быть более одной ячейки, которая еще не «выведена из очереди»?:

@objc func mySwipeAction (swipe: UISwipeGestureRecognizer) {

    switch swipe.direction.rawValue {
    case 1:
        print ("the PostID you selected to LIKE is ...")

    case 2:
          print ("the PostID you selected to Undo your LIKE is ...")

    default:
        break
    }
}

и мой tableView выглядит так:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCell(withIdentifier: "postTopContributions", for: indexPath) as! PostTopContributions
    let postImage = postImageArray [indexPath.row]
    let imageURL = postImage.postImageURL

    cell.delegate = self

    cell.postSingleImage.loadImageUsingCacheWithUrlString(imageURL)
    cell.postSingleLikes.text = "\(postImageArray [indexPath.row].contributionPhotoLikes)"
    cell.postSingleImage.isUserInteractionEnabled = true


    let leftSwipe = UISwipeGestureRecognizer(target: self, action: #selector(self.mySwipeAction(swipe:)))
    let rightSwipe = UISwipeGestureRecognizer(target: self, action: #selector(self.mySwipeAction(swipe:)))

    leftSwipe.direction = UISwipeGestureRecognizerDirection.left
    rightSwipe.direction = UISwipeGestureRecognizerDirection.right

    cell.postSingleImage.addGestureRecognizer(leftSwipe)
    cell.postSingleImage.addGestureRecognizer(rightSwipe)

    let selectedCell = self.postImageArray [indexPath.row]

    return cell
}

Я не хочу использовать собственный свайп строки TableView влево для удаления методов - в этом конкретном случае для различных целей UX.


person Brewski    schedule 27.11.2018    source источник
comment
Дело не в клетках. Речь идет об индексных путях.   -  person matt    schedule 27.11.2018


Ответы (3)


Ты можешь попробовать

cell.postSingleImage.addGestureRecognizer(leftSwipe)
cell.postSingleImage.addGestureRecognizer(rightSwipe)
cell.postSingleImage.tag = indexPath.row

Не рекомендуется добавлять жесты внутри cellForRowAt, вы можете добавить их внутри init для программных ячеек или awakeFromNib для ячеек xib/прототипа.


@objc func mySwipeAction (swipe: UISwipeGestureRecognizer) {

    let index = swipe.view.tag
    let selectedCell = self.postImageArray[index]
    switch swipe.direction.rawValue {
    case 1:
        print ("the PostID you selected to LIKE is ...")
       // edit dataSource array
    case 2:
          print ("the PostID you selected to Undo your LIKE is ...")
       // edit dataSource array

    default:
        break

   // reload table IndexPath
    }
}
person Sh_Khan    schedule 27.11.2018
comment
Это сработало, почему вы не рекомендуете добавлять жесты внутри cellForRowAt? - person Brewski; 28.11.2018
comment
поскольку ячейки используются повторно, добавление их несколько раз приводит к утечке памяти - person Sh_Khan; 28.11.2018

Вы можете передать свой indexpath в качестве параметра в своем селекторе. а затем добавьте лайк в yourArray[indexpath.row]

person shayegh    schedule 27.11.2018
comment
Я все еще немного нуб, можете ли вы объяснить, как это сделать? - person Brewski; 29.11.2018

Вы можете установить тег изображения ячейки, которое вы добавляете GestureRecognizer, в строку indexPath самой ячейки:

cell.postSingleImage.tag = indexPath.row
cell.postSingleImage.addGestureRecognizer(leftSwipe)
cell.postSingleImage.addGestureRecognizer(rightSwipe)

Затем вы можете определить, какая ячейка вызвала GestureRecognizer, получив тег представления, который вызвал жест смахивания:

@objc func mySwipeAction (gesture: UISwipeGestureRecognizer) {
     let indexPathRow = gesture.view.tag
     let indexPath = IndexPath(row: indexPathRow, section: 0) // assuming this is a 1 column table not a collection view
     if let cell = tableView.cellForRow(at: indexPath) as? PostTopContributions {
          // ... and then do what you would like with the PostTopContributions cell object
          print ("the PostID you selected to LIKE is ... " + cell.id)

     }

}

Надеюсь, что это помогло!

person hackerman58888    schedule 27.11.2018
comment
Спасибо, но я не могу заставить это работать: неоднозначная ссылка на элемент tableView (_: numberOfRowsInSection:)' - person Brewski; 29.11.2018
comment
Это означает, что Swift не находит ваш tableView. Убедитесь, что ваш tableView объявлен в вашем UIViewController, а ваш UIViewController является UITableViewDataSource и UITableViewDelegate. Ознакомьтесь с этим сообщением на SO: stackoverflow.com/questions/ 33724190/ - person hackerman58888; 29.11.2018