Как мне получить эти URL-адреса из JSON для загрузки в мою коллекцию XCode UICollection? - PullRequest
0 голосов
/ 24 октября 2018

Я так долго возился с этим API, и я не могу понять, как получить URL-адреса для загрузки в имеющийся у меня UICollectionView.Я могу напечатать только URL-адреса, как показано на этом изображении.enter image description here

Кроме того, вот как выглядит JSON, когда я его печатаю.enter image description here

И вот код моей игровой площадки, который я использую для доступа к API.

let fortniteChallengesURL9 = URL(string: "https://api.fortnitetracker.com/v1/store")
    if let unwrappedURL = fortniteChallengesURL9 {
      var request = URLRequest(url: unwrappedURL) request.addValue("MY API KEY", forHTTPHeaderField: "TRN-Api-Key")

let dataTask = URLSession.shared.dataTask(with: request) { (data, response, err) in

    if let data = data {

        do {


            let json = try JSONSerialization.jsonObject(with: data, options: [])
            print(json)
            print((json as AnyObject).value(forKey: "imageUrl")!)
           // print((json as AnyObject).value(forKey: "name")!)

            let urlImages = (json as AnyObject).value(forKey: "imageUrl")!





            DispatchQueue.main.asyncAfter(deadline: .now() ) {



            }


        } catch let jsonErr {
            print("Error serializing json:", jsonErr)

        }

    }



}
dataTask.resume()

}

А затем вам нужен UICollectionView.положить его в.Тем не менее, я испортил этот код, пытаясь понять, как это сделать.Я полагаю, что изображения, которые в настоящее время находятся внутри коллекции, должны быть заменены на WebView.

var arrayOfImages = [UIImage]()
var arrayOfIds = [String]()

override func viewDidLoad() {
    super.viewDidLoad()





    let collectionViewLayout = collectionView.collectionViewLayout as? UICollectionViewFlowLayout
    collectionViewLayout?.sectionInset = UIEdgeInsets(top: 20, left: 20, bottom: 0, right: 20)
    collectionViewLayout?.invalidateLayout()

    arrayOfImages = [#imageLiteral(resourceName: "Sats"),#imageLiteral(resourceName: "location"),#imageLiteral(resourceName: "news"),#imageLiteral(resourceName: "challengeBtn"),#imageLiteral(resourceName: "LTM")]
    arrayOfIds = ["A","B","C","D","E"]

}

override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return arrayOfImages.count
}

override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as UICollectionViewCell

    let imageView = cell.viewWithTag(1) as! UIImageView
    imageView.image = arrayOfImages[indexPath.row]

    return cell

}

override func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    let name = arrayOfIds[indexPath.row]
    let viewController = storyboard?.instantiateViewController(withIdentifier: name)
    self.navigationController?.pushViewController(viewController!, animated: true)
}

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

1 Ответ

0 голосов
/ 24 октября 2018

Можно попробовать

struct Root:Decodable {  
   let imageUrl:String
}

var arrayOfImages = [Root]()

arrayOfImages = try? JSONDecoder().decode([Root].self,from:data)

Тогда внутри cellForRowAt использовать SDWebImage

imageView.sd_setImage(with: URL(string:arrayOfImages[indexPath.row].imageUrl), placeholderImage: UIImage(named: "placeholder.png"))

Донне для того, чтобы перезагрузить коллекцию внутри обратного вызова

DispatchQueue.main.async { 
   self.collectionView.reloadData()
}
...