按钮状态在错误的单元格上激活

时间:2016-10-13 15:43:15

标签: swift firebase tableview

我在按钮中添加了按钮并添加了操作,因此如果用户触摸它,则状态为“不喜欢”,如果用户再次触摸,则状态为“喜欢”。但是,状态也适用于其他单元格按钮。如果我快速滚动它只是随机选择哪个单元格按钮应该具有状态。是什么原因造成的?

我在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)
    }

导致状态转移到其他按钮的原因是什么?我甚至添加了标签,以便检测所选按钮。是否与细胞再利用有关?

它将喜欢Firebase添加到正确的...

3 个答案:

答案 0 :(得分: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()
    }

Output :

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

答案 1 :(得分:1)

这是由滚动时重复使用前一个单元格引起的,并且是表格视图的基本机制。

您需要在每次调用cellForRowAtIndexPath时重置按钮的状态。

let cell = ...cell.starButton.addTarget之间,您需要根据您正在处理的索引路径执行cell.starButton.deselect().select()之类的操作。

答案 2 :(得分:1)

I think this issue is because of dequeuing your cell twice. you should try;

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