2016-10-13 1 views
1

Я добавил кнопку в ячейку и добавил действие, поэтому, если пользователь коснется его, тогда состояние «Не нравится», и если пользователь снова коснется состояния «Like». Тем не менее, состояние применяется и к другим кнопкам на ячейке. И если я быстро прокручу это, то просто случайно выбирает, какая кнопка ячейки должна иметь состояние. Что вызывает это?Состояние кнопки активируется в неправильных ячейках.

кнопку я вызываю с функцией внутри cellForRowAt indexPath: IndexPath функции, как это:

cell.likeButton.addTarget(self, action: #selector(like), for: .touchUpInside) 

И это функция, которая назначена кнопке:

func like(sender: UIButton){ 
    let section = 0 
    let row = sender.tag 
    let indexPath = IndexPath(row: row, section: section) 
    let cell: FeedTableViewCell = tableView.dequeueReusableCell(withIdentifier: "feedCell", for: indexPath) as! FeedTableViewCell 
    FIRDatabase.database().reference().child("posts").child(postsArray[indexPath.row].key).runTransactionBlock({ (currentData: FIRMutableData) -> FIRTransactionResult in 
     if var post = currentData.value as? [String : AnyObject], let uid = FIRAuth.auth()?.currentUser?.uid { 
      var stars : Dictionary<String, Bool> 
      stars = post["stars"] as? [String : Bool] ?? [:] 
      var starCount = post["starCount"] as? Int ?? 0 
      if let _ = stars[uid] { 
       // Unstar the post and remove self from stars 
       starCount -= 1 
       stars.removeValue(forKey: uid) 
       cell.likeButton.tag = indexPath.row 
       cell.likeButton.setTitle("Like", for: .normal) 

       cell.likeLabel.text = "\(starCount)" 
      } else { 
       // Star the post and add self to stars 
       starCount += 1 
       stars[uid] = true 
       cell.likeButton.tag = indexPath.row 
       cell.likeButton.setTitle("Dislike", for: .normal) 

       cell.likeLabel.text = "\(starCount)" 
      } 
      post["starCount"] = starCount as AnyObject? 
      post["stars"] = stars as AnyObject? 

      // Set value and report transaction success 
      currentData.value = post 

      return FIRTransactionResult.success(withValue: currentData) 
     } 
     return FIRTransactionResult.success(withValue: currentData) 
    }) { (error, committed, snapshot) in 
     if let error = error { 
      print(error.localizedDescription) 
     } 
    } 
} 

И как это я создал TableView с клетками :

 override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell: FeedTableViewCell = tableView.dequeueReusableCell(withIdentifier: "feedCell", for: indexPath) as! FeedTableViewCell 

     cell.likeButton.tag = indexPath.row 
     cell.likeButton.addTarget(self, action: #selector(self.tapped), for: .touchUpInside) 
    } 

Что заставляет государство переводить на o Кроме того, кнопки? Я даже добавил теги, чтобы обнаружить выбранную кнопку. Что-то связано с повторным использованием ячеек?

Он добавляет любит Firebase в правый один ..

+1

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

+0

@Cyrille Я отредактировал. –

+0

Если ваша подобная кнопка является прямым дочерним элементом вашей ячейки, вы должны попытаться получить 'indexPath', попросив табличный вид вместо создания нового на основе тега. 'let cellIndexPath = tableView.indexPathForCell (sender.superview)' – Crazyrems

ответ

1

Я думаю, что этот вопрос из-за извлечение из вашей клетки дважды. Ты должен попытаться;

func like(sender: UIButton){ 
    //your code ... 
    let cell: FeedTableViewCell = self.tableViewAddress.cellForRowAtIndexPath(indexPath) as! FeedTableViewCell 
    //Your code ... 
+0

Это сделало трюк: O Однако теперь, если я быстро нажимаю 2 раза он добавляет +2 –

1

Это вызвано повторное использование предыдущих клеток при прокрутке и является базовым механизмом представления таблицы.

Вам необходимо сбросить состояние своей кнопки при каждом звонке до cellForRowAtIndexPath.

Между let cell = ... и cell.starButton.addTarget вам нужно выполнить что-то вроде cell.starButton.deselect() или .select(), основываясь на пути индекса вы работаете.

+0

Я попробовал 'cell.starbutton.deselect' перед вызовом функция, да, теперь она не выбирает других, но она отменяет ее, если она выходит из поля зрения. Но что вы имеете в виду под заголовком «Основываясь на пути указателя, над которым вы работаете»? –

2
var selectindex : Int? 
    var selectedindex : NSMutableArray = NSMutableArray() 
    @IBOutlet var tableview: UITableView! 

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCellWithIdentifier("LikeCell", forIndexPath: indexPath) 

     let like: UIButton = (cell.viewWithTag(2) as! UIButton) 
     let comment: UIButton = (cell.viewWithTag(3) as! UIButton) 
     if selectedindex.containsObject(indexPath.row) { 
       like.setBackgroundImage(UIImage.init(named: "like.png"), forState: .Normal) 
     }else{ 
       like.setBackgroundImage(UIImage.init(named: "like (1).png"), forState: .Normal) 
     } 
     comment.setBackgroundImage(UIImage(named: "chat.png"), forState: UIControlState.Normal) 
     like.addTarget(self, action: #selector(self.CloseMethod(_:event:)), forControlEvents: .TouchDown) 
     comment.addTarget(self, action: #selector(self.CloseMethod1(_:event:)), forControlEvents: .TouchDown) 

     return cell 

    } 



@IBAction func CloseMethod(sender: UIButton, event: AnyObject) { 

     let touches = event.allTouches()! 
     let touch = touches.first! 
     let currentTouchPosition = touch.locationInView(self.tableview) 
     let indexPath = self.tableview.indexPathForRowAtPoint(currentTouchPosition)! 
     selectindex = indexPath.row 
     if selectedindex.containsObject(selectindex!) { 
      selectedindex.removeObject(selectindex!) 
      // call your firebase method for update database 
     }else{ 
       selectedindex.addObject(selectindex!) 
      // call your firebase method for update database 
     } 
     self.tableview.reloadData() 
    } 

Выход:

https://www.dropbox.com/s/ub7wln5y6hdw0sz/like%20button.mov?dl=0

+0

Какую кнопку вы привязали к CloseMethod func? –

+0

@ TarvoMäesepp как кнопка. Проверить мое видео –