我的代码存在问题,我已将我的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
}
}
答案 0 :(得分:1)
您的JSON响应不是图像。
cell.imageView.image = media[indexPath.item]as? UIImage
,您正在尝试将JSON值设置为UIImage。
http://www.flickr.com/services/feeds/photos_public.gne?tags=baseball&format=json&nojsoncallback=1
此网址返回带有URL's
的JSON对实际图片的响应。
然后,您需要{strong>来自这些实际图片网址。
编辑:(根据你的评论中的问题)
1:您获得了NSDictionary
JSON Respone。
2:在NSDictionary
内你得到一个带有“items”的NSArray
,(objectForKey:“items”)
3:在NSArray
内,每个图像对象都有一个对象,即NSDictionary
。
4:最后,在每个图像对象NSDictionary
中都有一个名为“media”(objectForKey:“media”)的URL,它是图像的最终URL。然后,您需要根据该URL下载UIImage
我不在Swift中编码所以我不想给你错误的代码示例,download the UIImage如何从JSON响应中获取URL或任何值。
答案 1 :(得分:0)
尝试使用此代码,您将获得预期的输出
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?) {
}
*/
}
我还附上了您将找到项目here
的链接