Невозможно перезагрузить только выбранную ячейку - PullRequest
0 голосов
/ 01 июля 2018

Я хочу перезагрузить только выбранную ячейку, в частности, при нажатии на изображение в ячейке. Но я получил ошибку, не могу преобразовать значение типа 'IndexPath.Type' в ожидаемый тип аргумента 'IndexPath' в этой строке: loadPostsValue (indexPath : IndexPath)

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
        let indexPath = self.collectionView.indexPathsForSelectedItems
        print(indexPath)
        loadPostsValue(indexPath: IndexPath)
    }

    func loadPostsValue(indexPath: IndexPath) {
        posts.removeAll()
        let ref = Database.database().reference()
        ref.child("posts").observe(.childAdded) { (snapshot: DataSnapshot) in
            if  let dict = snapshot.value as? [String: Any] {
                guard let titleText = dict["title"] as? String else{return}
                let locationDetails = dict["location"] as! String
                let captionText = dict["caption"] as! String
                let photoUrlString = dict["photoUrl"] as! String
                let priceText = dict["price"] as! String
                let categoryText = dict["category"] as! String
                let usernameLabel = dict["username"] as! String
                let profileImageURL = dict["pic"] as! String
                let heartInt = dict["heart"] as! Int
                let timestampString = dict["timestamp"] as! String
                let post = Post(titleText: titleText, captionText: captionText, locationDetails: locationDetails, photoUrlString: photoUrlString, priceText: priceText,categoryText: categoryText, usernameLabel: usernameLabel, profileImageURL: profileImageURL, heartInt: heartInt, timestampString: timestampString)
                self.posts.append(post)
                print(self.posts)
                self.collectionView.reloadItems(at: [indexPath])


            }
        }
    }

1 Ответ

0 голосов
/ 01 июля 2018

Вы должны предоставить необходимые indexPath, как показано ниже,

if let indexPath = self.collectionView.indexPathsForSelectedItems?.first {
    print(indexPath)
    loadPostsValue(indexPath: indexPath)
}

В настоящее время вы не передаете объект IndexPath, вместо этого вы передаете его Type, на который compiler жалуется. Также indexPathsForSelectedItems - это array всего выбранного элемента, поэтому вы должны получить первый indexPath, если множественный выбор вашего collectionView выключен.

Редактировать Я думаю, что простой способ - не использовать indexPathsForSelectedItems, когда у вас уже есть выбранный indexPath из самого метода делегата. Вы можете просто передать это, как показано ниже,

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    loadPostsValue(indexPath: indexPath)
}

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

func loadPostsValue(indexPath: IndexPath) {
    let ref = Database.database().reference()
    ref.child("posts").observe(.childAdded) { (snapshot: DataSnapshot) in
        if let dict = snapshot.value as? [String: Any] {
            guard let titleText = dict["title"] as? String else{ return }
            let post = self.posts[indexPath.row]
            post.heartInt = dict["heart"] as! Int
            self.collectionView.reloadItems(at: [indexPath])
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...