Как обновить мой collectionView с использованием протоколов? - PullRequest
0 голосов
/ 30 января 2019

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

Я уже пытаюсь перезагрузить представление коллекции после того, как моя функция не работает, я также пытаюсь перезагрузить отдельную ячейку, но все еще безрезультатно.Я чувствую, что упустил что-то маленькое или, может быть, я все делаю неправильно.

Это моя функция из моего протокола, который обращается к кнопке ячейки

func didTapVoteUp(for cell: HomeFeedCell, vibe: PostVibe) {
    print("Tap Up Vote From HomeFeedController")

    guard let city = CityState.currentCity else { return }
    guard let indexPath = collectionView.indexPath(for: cell) else { return }
    let vibe = self.postVibe[indexPath.item]
    fetchUpVote(userPostId: vibe.userPostId, postId: vibe.postId, city: city)

    guard let uid = Auth.auth().currentUser?.uid else { return }
    let values = [uid : 1]
    Database.database().reference().child("votes").child(vibe.postId).updateChildValues(values) { (err, _) in
        if let err = err {
            print("Failed to vote for post: ", err)
            return
        }
        print("Succesfully vote for the post")
        //Here is where I tried the collectionView.reloadData
        //and collectionView.reloadItems(at: [indexPath]) not working either
    }
}

Я создаю другую ячейку, которая выбирает данныечтобы иметь возможность обновлять информацию, но все равно не работает, используя collectionView.reloadData()

func fetchUpVote(userPostId: String, postId: String, city: String) {
    let ref = Database.database().reference().child("vibes").child("city").child(city).child(userPostId).child(postId)
    ref.observeSingleEvent(of: .value, with: { (snapshot) in

        guard let dictionary = snapshot.value as? [String: Any] else { return }
        let updatePost = PostVibe(userPostId: userPostId, postId: postId, dictionary: dictionary)

        let votes = updatePost.vote
        let currentTime = updatePost.limitPostTime
        let newLimitTime = currentTime.addingTimeInterval(60.0 * 30.0).timeIntervalSince1970

        let values = ["limitPostTime" : newLimitTime, "votes" : votes + 1 ] as [String : Any]

        let updateRef = Database.database().reference().child("vibes").child("city").child(city).child(userPostId).child(postId)
        updateRef.updateChildValues(values, withCompletionBlock: { (err, reference) in
            if let err = err {
                print("Failed to update values: ", err)
                return
            }
            print("Successfully updated it values: ", values)
            //This doesn't work either
            self.collectionView.reloadData()
        })
    })
    { (err) in
        print("Failed to fetch postIdWithUserId: ", err)
    }
}

import UIKit

protocol HomePostDelegate {
func didTapVoteUp(for cell: HomeFeedCell, vibe: PostVibe)
func didTapVoteDown(for cell: HomeFeedCell, vibe: PostVibe)
}

class HomeFeedCell: UICollectionViewCell {

var vibe: PostVibe? {
    didSet {
        guard let imageUrl = vibe?.imageUrl else { return }
        placeView.loadImage(urlString: imageUrl)

        guard let profileImageUrl = vibe?.creatorImageUrl else { return }
        vibeView.userPhotoView.loadImage(urlString: profileImageUrl)
        vibeView.creatorName.text = vibe?.creatorName

        if vibe?.hasVoteUp == true && vibe?.hasVoteDown == false {
            vibeView.voteUpButton.setImage(#imageLiteral(resourceName: "upVoteOn"), for: .normal)
            vibeView.voteDownButton.setImage(#imageLiteral(resourceName: "downVoteOff"), for: .normal)

            vibeView.voteUpButton.isEnabled = false
            vibeView.voteDownButton.isEnabled = true

        } else if vibe?.hasVoteDown == true && vibe?.hasVoteUp == false{
            vibeView.voteDownButton.setImage(#imageLiteral(resourceName: "downVoteOn"), for: .normal)
            vibeView.voteUpButton.setImage(#imageLiteral(resourceName: "upVoteOff"), for: .normal)

            vibeView.voteUpButton.isEnabled = true
            vibeView.voteDownButton.isEnabled = false

        }

        guard let voteNumber = vibe?.vote else { return }
        vibeView.votesDisplay.text = "\(voteNumber)"

    }
}
}

Я ожидаю, что автоматически обновлю .setImage с моих кнопок, которые находятся в моем HomeFeedCell ине работает.

Единственный способ обновить эти изображения, если я обновлю свой collectionView вручную или закрою приложение.

...