CollectionView отображает только последние данные - PullRequest
0 голосов
/ 07 октября 2019

Я использую API YouTube с alamofire для получения видеоданных (URL-адрес изображения, заголовок, описание и т. Д.). Ячейки показывают одно и то же изображение всякий раз, когда я получаю данные и добавляю их в свой массив. Но когда я печатаю заголовки и URL-адреса в методе «getfeed», дисплей отображается правильно.

view cellForItemAtIndexPath. Я думаю, что проблема здесь. всякий раз, когда я печатаю title & url в функции cellForItemAt, данные повторяются

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "photoCell", for: indexPath) as! PhotoCell

    //image
    let thumbnailUrl = URL(string: videos[indexPath.item].videoThumnailUrl)

    cell.imageView.kf.setImage(with: thumbnailUrl)

    //prints same title & img url
    print("title cell ",videos[indexPath.item].videoTitle)
    print("thmbUrl cell",videos[indexPath.item].videoThumnailUrl)

    return cell
}

getfeedVideos, но когда я печатаю заголовок и url в функции get feed, они правильно набираются. данные добавляются в массив tempVideos

func getFeedVideos()  {

    Alamofire.request(videoURL,
                      method: .get,
                      parameters:["part":"snippet",
                                  "regionCode":"US",
                                  "chart":"mostPopular",
                                  "maxResults":3,
                                  "key":API_KEY]).responseJSON {
                                    response in
                                    if response.result.isSuccess {

                                        print("Success! Got the video data")
                                        let videoJSON : JSON = JSON(response.result.value!)
                                        //print(videoJSON)

                                        //creating video object off of JSON response
                                        let videoObj = Video()
                                        var tempVideos = [Video] ()

                                        //loops through all items in videoJson and assigns each value
                                        for (_, value):(String, JSON) in videoJSON["items"] {

                                            videoObj.videoId = value["id"].stringValue
                                            videoObj.videoTitle = value["snippet"]["title"].stringValue
                                            videoObj.videoDescription = value["snippet"]["description"].stringValue
                                            videoObj.videoThumnailUrl = value["snippet"]["thumbnails"]["standard"]["url"].stringValue

                                            //prints different title & img url
                                            print("title ",videoObj.videoTitle)
                                            print("thmbUrl" ,videoObj.videoThumnailUrl)
                                            tempVideos.append(videoObj)
                                        }
                                        self.videos = tempVideos
                                        self.collectionView.reloadData()


                                    } else {
                                        print("Error \(String(describing: response.result.error))")

                                    }

    }

}

объект класса видео

import UIKit
class Video: NSObject {

var videoId: String = ""
var videoTitle: String = ""
var videoDescription: String = ""
var videoThumnailUrl: String = ""


}

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

1 Ответ

0 голосов
/ 07 октября 2019

Ваш CollectionView отображает только последние данные, потому что вы не создаете new instance для каждой видеоданных. Вы просто создаете one instance и присваиваете значение properties из same instance. Вы должны создать new instance of Video для всех видеоданных.

let videoObj = Video()

Вы должны написать выше lin внутри вашего for loop. как следующий

//let videoObj = Video() remove this line and add it inside for loop
var tempVideos = [Video] ()

//loops through all items in videoJson and assigns each value
for (_, value):(String, JSON) in videoJSON["items"] {
    // here you have to create new object of Video for every iteration
    let videoObj = Video()

    videoObj.videoId = value["id"].stringValue
    videoObj.videoTitle = value["snippet"]["title"].stringValue
    videoObj.videoDescription = value["snippet"]["description"].stringValue
    videoObj.videoThumnailUrl = value["snippet"]["thumbnails"]["standard"]["url"].stringValue

    //prints different title & img url
    //print("title ",videoObj.videoTitle)
    print("thmbUrl" ,videoObj.videoThumnailUrl)
    tempVideos.append(videoObj)
}
...