2016-06-17 11 views
0

Ich versuche, eine Liste von Elementen anzuzeigen. Mein Endspiel zeigt ein Raster mit Bildern aus einer Reihe von Strings, bei denen es sich um URLs und Dateinamen in meiner IOS-App handelt.Anzeige UIImage mit einem Bild von einer URL

Ich habe eine Collection, die ein Raster von Bildern über ein Array von String-Dateinamen angezeigt wird, und das funktioniert:

Array:

var tableImages: [String] = ["car.jpg", "bus.jpg", "plane.jpg"] 

Code, der funktioniert:

cell.imgCell.image = UIImage(named: tableImages[indexPath.row]) 

Mein nächster Schritt ist das Ermitteln des Codes zum Anzeigen eines Gitters von Bildern über ein Array von String-URLs. Und das ist meine Frage. Wie zeige ich ein Bild von einer URL an?

Array:

var tableImages: [String] = ["http://www.hotelstmarie.com/wp-content/uploads/2014/12/HSM_Guest-Rooms_1500x750-06-02-2015.jpg", "http://media-cdn.tripadvisor.com/media/photo-s/03/4f/b0/58/aviva-by-kameel.jpg"] 

Code, das funktioniert:

? 

Hinweise:

Ich habe andere Stackoverflow Fragen über die Angelegenheit überprüft, aber sie sind von Jahren und der Umzug to swift hat ihre Antworten veraltet gemacht.

Nachdem ich herausfinden, wie man URL-Bilder anzeigen werde ich nur einige if-Anweisungen zu erkennen, URL oder Dateiname, um es zu meinem Endspiel zu machen, aber das ist nicht Teil dieser Frage.

EDIT 1

-Code um meinen Code oben:

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { 
    let cell: CollViewCell = collectionView.dequeueReusableCellWithReuseIdentifier("Cell", forIndexPath: indexPath) as! CollViewCell 
    cell.labelCell.text = tableData[indexPath.row] 
    cell.imgCell.image = UIImage(named: tableImages[indexPath.row]) 
    return cell 
} 

EDIT 2

Alamofire Verwendung:

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { 
    let cell: CollViewCell = collectionView.dequeueReusableCellWithReuseIdentifier("Cell", forIndexPath: indexPath) as! CollViewCell 
    cell.labelCell.text = tableData[indexPath.row] 
    let imageUrl = NSURL(string: tableImages[indexPath.row]) 
    cell.imgCell.af_setImageWithUrl(imageUrl, placeholderImage: nil, filter: nil, imageTransition: .CrossDissolve(0.2)) 
    return cell 
} 

gibt diesen Fehler:

Value of type 'UIImageView' has no member 'af_setImageWithUrl' 

Antwort

1

Die Art und Weise Sie Ihre Bildeinstellung sind hier:

cell.imgCell.image = UIImage(named: tableImages[indexPath.row]) 

funktioniert nur für lokale Bilder in Ihrem Projekt, so dass Ihr alle werden versuchen, für ein Bild, das gleiche wie Ihre URL lokal genannt zu suchen.

Während Sie das Bild manuell laden können, ist die beste Alternative, eine Bildlade-Bibliothek zu verwenden, um häufige Probleme zu vermeiden, wie zum Beispiel die Vermeidung von alten Bildern beim Laden Ihrer Ansicht.

In swift habe ich AlamofireImage wie so verwendet:

let imageUrl = NSURL(string: tableImages[indexPath.row]) 
cell.imgCell.af_setImageWithURL(imageUrl, placeholderImage: nil, filter: nil, imageTransition: .CrossDissolve(0.2)) 

wie Sie sehen können, diese Bibliothek verwendet Swifts extensions, die es api stark vereinfacht.

+0

Danke für den Vorschlag, ich habe es gerade ausprobiert, kannst du meine Bearbeitung 2 sehen? – Rorschach

+0

@Rorschach Am Anfang Ihrer Datei müssen Sie 'import AlamofireImage' zu ​​Ihrem Projekt hinzufügen. Hier ist ein Link zum Repo mit Anweisungen zur Installation: https://github.com/Alamofire/AlamofireImage (es verwendet entweder Cocoapods oder Karthago) – EricDS

+1

@Rorschach meine schlechte, ich schrieb den Namen der Methode falsch (ich tippte 'af_setImageWithUrl' und es war' af_setImageWithURL'). Ich habe meine Antwort mit der richtigen Methode bearbeitet. – EricDS

1

Sie würden schreiben:

if let url = NSURL(string: tableImages[indexPath.row]){ 
    let data = NSData(contentsOfURL: url) 
    let image = UIImage(data: data!) 
    cell.imgCell.image = image 
} 

Obwohl ich eine bestehende Swift Bibliothek empfehlen (wie Kingfisher), die Thread-Management und Caching für Sie übernimmt, so dass Ihre App nicht aus dem Speicher läuft oder einfrieren, während es die Bilder herunterlädt. Ich verwende derzeit SDWebImage.

+0

Dies geht durch ohne Fehler, aber keine Bilder angezeigt werden, Ill Arbeit mit meinem Code und sehen, was oben und akzeptieren diese Antwort, wenn es führt mich zur Antwort – Rorschach

+0

@Rorschach Das Problem * könnte * sein, dass die Bilder nur eine Weile dauern, um herunterzuladen. Wenn ja, ist es besser, eine der erwähnten Bibliotheken oder andere (wie Alamofire) zu verwenden :) – Daven

2
func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { 
    let cell: CollViewCell = collectionView.dequeueReusableCellWithReuseIdentifier("Cell", forIndexPath: indexPath) as! CollViewCell 
    cell.labelCell.text = tableData[indexPath.row] 

    if let url = NSURL(string: tableImages[indexPath.row]) 
    { 
     if let data = NSData(contentsOfURL: url) 
     { 
      cell.imgCell.image = UIImage(data: data) 
     } 
    } 

    return cell 
} 
0

Ich habe Swift-Version von UIImageView + AFNetworking aus AFNetworking Bibliothek verwendet, die Sie von github erhalten. Sehr einfach zu bedienen. Legen Sie einfach die Datei in Ihrem Projekt und schon können Sie wie folgt beginnen:

cell.imageView.setImageWithUrl(imageUrl!,placeHolderImage: UIImage(named: "placeholder"))