Свифт при нажатии кнопки в ячейке дают дубликаты в других ячейках - PullRequest
0 голосов
/ 30 сентября 2018

Я получаю данные из firebese и показываю в tableView

В tavleViewCell у меня есть кнопки: like, unLike

, когда я нажимаю like, нужно скрывать likeButton и показывать UnlikeButton и сохранять / удалять данные изfirebase

Теперь я создаю методы, и когда я нажимаю «Нравится» -> «Сохранить данные в Firebase» и отображают.row, в отличие от кнопки, показанной в 0,6,12,17 ..) Возможно, это может произойти, когда я прокручиваю tableView

в ячейке, которую я имею:

protocol TableThemeQuote {

    func likeTap(_ sender: ThemesQuoteCell)
    func unlikeTap(_ sender: ThemesQuoteCell)
}

class ThemesQuoteCell: UITableViewCell {
 @IBOutlet weak var likeBtn: UIButton!
 @IBOutlet weak var unlikeBtn: UIButton!

 var themeDelegate: TableThemeQuote?
 var index: indexPath?

@IBAction func likeBtn(_ sender: UIButton) {
 sender.tag = index.row
 themeDelegate?.likeTap(self)
}

@IBAction func unLikeBtn(_ sender: UIButton) {
sender.tag = index.row
themeDelegate?.unlikeTap(self)
}
}

В ViewController:

var userMarks: [String] = [String]()

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

 func likeLike() {
        let userUID = Auth.auth().currentUser!.uid
        let ref = Database.database().reference().child("users").child("\(userUID)")
        ref.observeSingleEvent(of: .value, with: { (snapshot) in
            if let properties = snapshot.value as? [String : AnyObject] {
                 if let peopleWhoLike = properties["userLikes"] as? [String : AnyObject] {
                    self.likeLikeL.append(peopleWhoLike)
                 for (id,person) in peopleWhoLike {
                self.userLikeCheck.updateValue(person, forKey: id)
                     self.userMarks.append(person as! String)
                }
                }
            }
        })
}

В cellForRowAt indexPath:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "themesQuoteCell") as! ThemesQuoteCell
        let index = indexPath.row
        cell.index = index
        cell.themeDelegate = self
        let mark = "Темы/\(themeName)/\(quotenumber[index.row])"
        if userMarks.contains(mark){
            if cell.likeBtn.tag == index.row {
                cell.likeBtn.isHidden = true
                cell.unlikeBtn.isHidden = false
                break
             }
        }
        return cell
}    

В расширении TableThemeQuote:

расширение ThemeQuoteVC: TableThemeQuote {

func likeTap(_ sender: ThemesQuoteCell) {
guard let tappedIndexPath = themeQuoteTableView.indexPath(for: sender) else { return }

                let ref = Database.database().reference().child("Темы").child("\(self.themeName)").child("\(quotenumber[tappedIndexPath.row])")
                let keyToPost = ref.childByAutoId().key!
                let updateLikes: [String : Any] = ["peopleWhoLike/\(keyToPost)" : Auth.auth().currentUser!.uid]
                ref.updateChildValues(updateLikes, withCompletionBlock: { (error, reff) in
                    if error == nil {
                        ref.observeSingleEvent(of: .value, with: { (snap) in
                            if let properties = snap.value as? [String : AnyObject] {
                                if let likes = properties["peopleWhoLike"] as? [String : AnyObject] {
                                    let count = likes.count
                                    sender.likeLbl.text = "\(count)"
                                    let update = ["quant" : count]
                                    ref.updateChildValues(update)
                                    sender.likeBtn.isHidden = true
                                    sender.unlikeBtn.isHidden = false
                                    sender.likeBtn.isEnabled = true
                                }
                            }
                        })
                    }
                })
                ref.removeAllObservers()
                }
func unlikeTap(_ sender: ThemesQuoteCell) {

        sender.unlikeBtn.isEnabled = false
        guard let uid = Auth.auth().currentUser?.uid else { return }
        let ref = Database.database().reference().child("users").child("\(uid)")
        guard let tappedIndexPath = themeQuoteTableView.indexPath(for: sender) else { return }
        let mark = "Темы/\(themeName)/\(quotenumber[tappedIndexPath.row])"
        unlikeCellBtn(index: tappedIndexPath.row, sender: sender)
        if sender.unlikeBtn.tag == tappedIndexPath.row {
        ref.observeSingleEvent(of: .value, with: { (snapshot) in
            if let properties = snapshot.value as? [String : AnyObject] {
                if let peopleWhoLike = properties["userLikes"] as? [String : AnyObject] {
                    for (id,person) in peopleWhoLike {
                        if person as! String == mark {
                            ref.child("userLikes").child(id).removeValue(completionBlock: { (error, reff) in
                                if error == nil {
                                    ref.observeSingleEvent(of: .value, with: { (snap) in
                                        if let prop = snap.value as? [String : AnyObject] {
                                            if let likes = prop["userLikes"] as? [String : AnyObject] {
                                                let count = likes.count
                                                ref.updateChildValues(["quantLikes" : count])
                                            }else {
ref.updateChildValues(["quantLikes" : 0])
                                            }
                                        }
                                    })
                                }
                            })
                            sender.likeBtn.isHidden = false
                                                        sender.unlikeBtn.isHidden = true
                                                        sender.unlikeBtn.isEnabled = true
                                                        break
                        }
                    }
                }
            }
        })
        }
        ref.removeAllObservers()
        }

Что я делаю не так и как могуЯ получаю текущее нажатие и показываю / скрываю только ту кнопку, которую нажимаю?

1 Ответ

0 голосов
/ 30 сентября 2018

Клетки используются повторно.Эта часть кода

  if userMarks.contains(mark){
        if cell.likeBtn.tag == index.row {
            cell.likeBtn.isHidden = true
            cell.unlikeBtn.isHidden = false
            break
         }
    }

устанавливает свойства hidden в зависимости от некоторых условий, но сохраняет состояние hidden без изменений, если условия не выполняются.

Что нужно сделатьзаключается в добавлении предложения else для установки значений по умолчанию (кстати, оператор break не имеет смысла)

  if userMarks.contains(mark) && cell.likeBtn.tag == index.row {
      cell.likeBtn.isHidden = true
      cell.unlikeBtn.isHidden = false     
  } else {
      cell.likeBtn.isHidden = <default value>
      cell.unlikeBtn.isHidden = <default value>
  }
...