2016-05-13 16 views
1

Ich benutze Alamofire, um URL-Bild von JSON-Datei zu erhalten, und möchte das Bild, das ich von JSON zu Bildansicht in Zelle erhalten. Ich bin neu in der schnellen und schnellen Vernetzung.Das Bild in Zelle erscheint nicht

Mein Code auf MainCollectionViewController:

private let reuseIdentifier = "Cell" 

class MainCollectionViewController: UICollectionViewController { 

var result:String = "" 

override func viewDidLoad() { 
    super.viewDidLoad() 



} 
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 1 
} 

override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { 
    let cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath) as! MainCollectionViewCell 

    Alamofire.request(.POST, "URL That Contain JSON").responseJSON { response in 

     if let value = response.result.value { 

      let json = JSON(value) 

      let data = json["data"].arrayValue 

      self.result = data[0]["image"].stringValue 

      print(self.result) 

     } 
    } 

    let imageName = (result) 
    cell.mainImageView.image = UIImage(named:imageName) 

    return cell 
} 

Und das Bild Auslass ist in MainCollectionViewCell:

class MainCollectionViewCell: UICollectionViewCell { 
    @IBOutlet weak var mainImageView: UIImageView! 
} 

Der Build succeded aber das Bild nicht erscheint, zeigt Zelle ohne im Inneren Bild.

Antwort

0

Antwort läuft in verschiedenen Thread so zu dieser Zeit "Ergebnis" hat keine Daten. Versuchen Sie zu laden, nachdem die Antwort Ihr Problem gelöst hat.

override func viewDidLoad() { 
    super.viewDidLoad()  
    getImage() 
} 
func getImage() 
{ 
    Alamofire.request(.POST, "URL That Contain JSON").responseJSON { response in 

    if let value = response.result.value { 

     let json = JSON(value) 

     let data = json["data"].arrayValue 

     self.result = data[0]["image"].stringValue 

     print(self.result) 

    } 
//reload collection view 
} 

override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { 

let cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath) as! MainCollectionViewCell 
    let decodedData = NSData(base64EncodedString: result, options: NSDataBase64DecodingOptions(rawValue: 0)) 
        let decodedimage = UIImage(data: decodedData!) 

cell.mainImageView.image = decodedimage 
return cell 
} 
+0

get thread 1: Signal SIGABRT –

+0

hast du das Problem gelöst? –

0

In Ihrem Code haben Sie Ihre Feder nicht registriert.

self.collectionView.registerNib(UINib(nibName: "MainCollectionViewCell", bundle: nil), forCellReuseIdentifier: "MainCollectionViewCell") 

Setzen Sie diesen Code auf ViewDidLoad

2

Alamofire noch für JSON anfordert, aber Sie haben Ihre UIImageView aktualisiert, bevor die Antwort eintrifft. Bevor Alamofire mit Antwort zurückkommen kann, versucht Ihr Code, UIImageView mit dem Ergebnis zu aktualisieren, das noch nicht empfangen worden ist, Ihre Result Zeichenkette noch eine leere Zeichenkette zu machen, gerade wie Sie oben erklärten. Deshalb erhalten Sie UIImageView leer.

override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { 
let cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath) as! MainCollectionViewCell 

Alamofire.request(.POST, "URL That Contain JSON").responseJSON { response in 
    if let value = response.result.value { 
     let json = JSON(value) 
     let data = json["data"].arrayValue 
     self.result = data[0]["image"].stringValue 
     print(self.result) 
     let imageName = (result) 
     cell.mainImageView.image = UIImage(named:imageName) 
    } 
} 
return cell 
} 

Es ist jedoch keine beliebte Vorgehensweise, eine Ladeanforderung zu stellen, wenn die Zelle aktualisiert wird.

+0

funktioniert immer noch nicht. Leere Zelle wie vor –

+0

Ich nehme an, dass Sie URL-Zeichenfolge für das Bild erhalten. Wenn dies der Fall ist, ändern Sie die URL zum Bild über NSData. Sie können auch die Klasse UIImage + AfNetworking.swift verwenden, die Sie herunterladen können, um ein Bild von der URL als Antwort zu erhalten. –

0

Sie erhalten nur Bild-URL nicht Bild vom Server, also zuerst sollten Sie Bild herunterladen dann in mainImageView gesetzt werden.

Verwandte Themen