2017-11-02 4 views
0

ニュースフィードを作成すると、ユーザーは投稿を好きにするか嫌いにするかを選択できます。このイベントが発生すると、同様のイメージの色がそれに応じて変化します。コードが正しく、バックエンドデータがすべて動作しています(IE:好き嫌いの値が正しく更新されます)。問題は、私がポストを好きまたは嫌いにすると、他のすべての嫌いな画像が色が変わって、対応する画像が正しく表示されないということです。ここでcellforrowat tableviewcell内部コードである:TableViewCellsは、Firebaseデータに基づいて正しいイメージを読み込んでいません。

TableViewCell同様

func likeTapped(sender: UITapGestureRecognizer) { 

    FriendSystem.system.loadUserFriends(post.userID) 
    if FriendSystem.system.USER_REF.child(post.userID).key == FriendSystem.system.CURRENT_USER_ID { 
     return 
    } else { 
     likesRef.observeSingleEvent(of: .value, with: { (snapshot) in 
      if let _ = snapshot.value as? NSNull { 
       self.dislikeRef.observeSingleEvent(of: .value, with: {(snapshot) in 
        if let _ = snapshot.value as? NSNull { 
         self.likesImage.image = UIImage(named: "trending_fire") 
         self.dislikeImage.image = UIImage(named: "upsidedownGrayFire") 
         self.currentUser.adjustScore(addScore: true) 
         FriendSystem.system.postUsersFriends.forEach({ (key) in 
          self.post.adjustUserLikes(key: key, addLike: true) 
         }) 
         self.likesRef.setValue(true) 

        } else { 
         self.likesImage.image = UIImage(named: "gray_fire") 
         self.dislikeImage.image = UIImage(named: "upsidedownGrayFire") 
         self.currentUser.adjustScore(addScore: true) 
         FriendSystem.system.postUsersFriends.forEach({ (key) in 
          self.post.adjustUserLikes(key: key, addLike: true) 

         }) 
         self.dislikeRef.removeValue() 

        } 

       }) 

      } else { 
       self.likesImage.image = UIImage(named: "gray_fire") // Change the image 
       self.dislikeImage.image = UIImage(named: "upsidedownGrayFire") 
       self.currentUser.adjustScore(addScore: false) 
       FriendSystem.system.postUsersFriends.forEach({ (key) in 
        self.post.adjustUserLikes(key: key, addLike: false) // Remove the like 

       }) 
       self.likesRef.removeValue() // removes the value to false in the DB 

      } 
     }) 
    } 
} 

CellForRowAtの場合に

func configureCell(post: Post) { 
    self.post = post 

    likesRef = FriendSystem.system.CURRENT_USER_LIKES_REF.child(self.post.postID) 
    dislikeRef = FriendSystem.system.CURRENT_USER_DISLIKES_REF.child(self.post.postID) 

    FriendSystem.system.CURRENT_USER_LIKES_REF.child(post.postID).observeSingleEvent(of: DataEventType.value, with: { (snapshot) in 
     if let _ = snapshot.value as? NSNull{ 
      self.likesImage.image = #imageLiteral(resourceName: "gray_fire") 
     } else { 
      self.likesImage.image = #imageLiteral(resourceName: "trending_fire") 
     } 
    }) 

    FriendSystem.system.CURRENT_USER_DISLIKES_REF.child(post.postID).observeSingleEvent(of: DataEventType.value, with: { (snapshot) in 
     if let _ = snapshot.value as? NSNull { 
      self.dislikeImage.image = #imageLiteral(resourceName: "upsidedownGrayFire") 
     } else { 
      self.dislikeImage.image = #imageLiteral(resourceName: "blueFire") 
     } 
    }) 
} 

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

    let post = FriendSystem.system.friendPosts[indexPath.row] 
    if let cell = tableView.dequeueReusableCell(withIdentifier: "postCell") as? FriendPostCell { 

     cell.configureCell(post: post) 
     cell.transform = CGAffineTransform(scaleX: 1, y: -1) 
     cell.delegate = self 
     return cell 
    } 
    return UITableViewCell() 
} 

私は約1週間これに固執しており、概念を一括して削除することを検討しています。どんな助けもありがとう。また、余分な、または欠落しているクロージャがある場合は、問題を示すために実際のコードを編集したためです。

+0

これが参考になると思います。 https://stackoverflow.com/questions/42916316/uitableview-cell-is-displaying-an-incorrect-image-even-while-setting-the-image –

答えて

1

「likes」とFirebaseで同様の問題が発生しました。私はtapGestureRecognizerを使用しているので、あなたの特定の問題に話すことができず、どこに適用されているのかわかりません。しかし、どのように私が自分の問題を解決したかを示すことができ、おそらく私たちはこの問題の解決に役立ついくつかのコードを共有することができます。

私は推測を取らなければならなかった場合、私はこの方法でのあなたの問題を言うと思います:

func configureCell(post: Post) { 
    self.post = post 

    likesRef = FriendSystem.system.CURRENT_USER_LIKES_REF.child(self.post.postID) 
    dislikeRef = FriendSystem.system.CURRENT_USER_DISLIKES_REF.child(self.post.postID) 

    FriendSystem.system.CURRENT_USER_LIKES_REF.child(post.postID).observeSingleEvent(of: DataEventType.value, with: { (snapshot) in 
     if let _ = snapshot.value as? NSNull{ 
      self.likesImage.image = #imageLiteral(resourceName: "gray_fire") 
     } else { 
      self.likesImage.image = #imageLiteral(resourceName: "trending_fire") 
     } 
    }) 

    FriendSystem.system.CURRENT_USER_DISLIKES_REF.child(post.postID).observeSingleEvent(of: DataEventType.value, with: { (snapshot) in 
     if let _ = snapshot.value as? NSNull { 
      self.dislikeImage.image = #imageLiteral(resourceName: "upsidedownGrayFire") 
     } else { 
      self.dislikeImage.image = #imageLiteral(resourceName: "blueFire") 
     } 
    }) 

私は、これが問題である疑う理由はFirebaseの非同期性によるものです。クエリに時間がかかり、結果が返されてそのセルに適用されると、ユーザーがスクロールした場合に再利用される可能性があります。つまり、誤ったセル画像が変更されます。

まず、すべての投稿に表示する画像を決定する値「userLiked」があることをお勧めします。私の場合は、どのようなボタンが表示されているかを変更しています。 cellForRowAtで

あなたはこのような何かをチェック:そのユーザが以前post.userLikedローカルに格納された値を更新し、細胞画像を更新し、その記事を気に入った場合

if dataSource[indexPath.row]!.userLiked == nil { 
     DatabaseFunctions.userLiked(postID: key, cell: cell) 
} 

はチェックをuserLiked。ここで

は、私はこれを達成しています方法です:

static func userLiked(postID: String, cell: BetterPostCell) { 
     let likeRef = Database.database().reference() 
     if let uid = Auth.auth().currentUser?.uid { 
      likeRef.child("userActivity").child(uid).child("likes").child(postID).queryOrderedByKey().observeSingleEvent(of: .value, with: { snap in 
       if snap.exists() { 
        cell.helpfulButton.isHidden = true 
        cell.notHelpfulButton.isHidden = false 
        postDict[postID]?.userLiked = true 

       } 
       else { 
        postDict[postID]?.userLiked = false 
       } 
      }) 
     } 
    } 

は、あなたが質問があるなら、私に教えてください。

+0

ありがとうございました。この洞察は実際問題を解決するように私を導いたが、私はコードを少し少なくしてやった。 userLiked - > Boolのデータ属性を作成するあなたの考えは、私の問題を解決しました。基本的には、firebaseノードをチェックする必要はなく、私はポストクラスをチェックし、それに応じてイメージを調整することができました。そこから、私がしなければならなかったのは、画像がタップされたときにBoolの値を変更することでした。コメントしていただきありがとうございます、これは素晴らしいことでした! – Chris

関連する問題