[英]Parsing JSON and extracting URLS for images
我的代碼有問題,我已經將JSON解析為獲取圖像URL的級別。 我正在嘗試使用URL給我的圖像填充集合視圖單元格中的圖像視圖。 這是我的代碼。
import UIKit
class ViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource {
var media = NSDictionary()
@IBAction func SearchBTN(_ sender: AnyObject) {
getPictures()
}
@IBOutlet weak var CollectionView: UICollectionView!
@IBOutlet weak var searchBoxTF: UITextField!
func getPictures(){
let url = URL(string: "http://www.flickr.com/services/feeds/photos_public.gne?tags=baseball&format=json&nojsoncallback=1")
let session = URLSession(configuration: URLSessionConfiguration.default)
let task = URLSession.shared.dataTask(with: url!){(data, response, error) in
if error != nil
{
print("Error")
}
else
{
if let content = data
{
do
{
let myJSON = try JSONSerialization.jsonObject(with: content, options: JSONSerialization.ReadingOptions.mutableContainers) as? AnyObject
//print(myJSON)
if let images = myJSON?["items"] as? [[String: AnyObject]]
{
var media = UIImage()
for media in images
{
// let media = self.media
print(media["media"])
}
}
}
catch
{
}
}
}
}
task.resume()
}
override func viewDidLoad() {
super.viewDidLoad()
CollectionView.delegate = self
CollectionView.dataSource = self
// Do any additional setup after loading the view, typically from a nib.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return media.count
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "ImageCell", for: indexPath) as! ImageCollectionViewCell
cell.imageView.image = media[indexPath.item]as? UIImage
return cell
}
}
您的JSON響應不是圖像。
cell.imageView.image = media[indexPath.item]as? UIImage
cell.imageView.image = media[indexPath.item]as? UIImage
,您正在嘗試為cell.imageView.image = media[indexPath.item]as? UIImage
設置JSON值。
http://www.flickr.com/services/feeds/photos_public.gne?tags=baseball&format=json&nojsoncallback=1
此URL返回JSON對具有實際圖像的 URL's
響應。
然后,您需要從那些實際的圖像URL 下載UIImage 。
編輯:(基於您在評論中的問題)
1:您將獲得NSDictionary
JSON Respone。
2:在NSDictionary
內部,您將獲得一個帶有“ items”的NSArray
,(objectForKey:“ items”)
3:在該NSArray
,每個圖像對象都有一個對象,即NSDictionary
。
4:最后,在每個圖像對象NSDictionary
都有一個名為“ media”的URL(objectForKey:“ media”),它是圖像的最終URL。 然后您需要根據該URL下載UIImage
我沒有用Swift編寫代碼,所以我不想給您錯誤的代碼示例, 有很多線程如何從JSON響應中獲取URL或任何值。
試試這個代碼,您將獲得預期的輸出
import UIKit
private let reuseIdentifier = "Cell"
class MCollectionViewController: UICollectionViewController {
var arraImage: [String] = [String]()
override func viewDidLoad() {
super.viewDidLoad()
// Uncomment the following line to preserve selection between presentations
// self.clearsSelectionOnViewWillAppear = false
self.collectionView!.backgroundColor = UIColor.whiteColor()
RestAPIManager.sharedInstance.getServerData { (Json) -> Void in
//print("Response = \(Json)")
let array = Json["items"].arrayValue
for item in array {
print("\(item["media"]["m"])")
self.arraImage.append(item["media"]["m"].stringValue)
dispatch_async(dispatch_get_main_queue(), { () -> Void in
self.collectionView!.reloadData()
})
}
}
}
/*
// MARK: - Navigation
// In a storyboard-based application, you will often want to do a little preparation before navigation
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
// Get the new view controller using [segue destinationViewController].
// Pass the selected object to the new view controller.
}
*/
// MARK: UICollectionViewDataSource
override func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int {
// #warning Incomplete implementation, return the number of sections
return 1
}
override func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
// #warning Incomplete implementation, return the number of items
return arraImage.count
}
func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {
let padding = 10
let collectionViewSize = collectionView.frame.size.width - CGFloat(padding)
return CGSizeMake(collectionViewSize/2, collectionViewSize/2)
}
override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath) as! CollectionViewCell
if let url: NSURL = NSURL(string: arraImage[indexPath.row]) {
cell.imageView.sd_setImageWithURL(url)
}
return cell
}
// MARK: UICollectionViewDelegate
/*
// Uncomment this method to specify if the specified item should be highlighted during tracking
override func collectionView(collectionView: UICollectionView, shouldHighlightItemAtIndexPath indexPath: NSIndexPath) -> Bool {
return true
}
*/
/*
// Uncomment this method to specify if the specified item should be selected
override func collectionView(collectionView: UICollectionView, shouldSelectItemAtIndexPath indexPath: NSIndexPath) -> Bool {
return true
}
*/
/*
// Uncomment these methods to specify if an action menu should be displayed for the specified item, and react to actions performed on the item
override func collectionView(collectionView: UICollectionView, shouldShowMenuForItemAtIndexPath indexPath: NSIndexPath) -> Bool {
return false
}
override func collectionView(collectionView: UICollectionView, canPerformAction action: Selector, forItemAtIndexPath indexPath: NSIndexPath, withSender sender: AnyObject?) -> Bool {
return false
}
override func collectionView(collectionView: UICollectionView, performAction action: Selector, forItemAtIndexPath indexPath: NSIndexPath, withSender sender: AnyObject?) {
}
*/
}
我還附上了鏈接,您可以在此處找到該項目
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.