2016-08-02 50 views
0

Ich wurde gerade von dem Fehler dieses sehr einfachen Codes (den ich vom Projekt getrennt habe) überwältigt.Swift 2.2 - Richtiger Weg, um ein UIImageView programmgesteuert zu initialisieren

import UIKit 

class ViewController: UIViewController { 

    weak var garageDoor: UIImageView! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     if let image = UIImage(named: "garagedoorclosed") { 
      print("image ready: \(image)") 
      garageDoor = UIImageView(image: image) 

      print("garageDoor: \(garageDoor)") 

      garageDoor.frame = CGRectMake(0, 0, 560, 400) // fails here! 
      view.addSubview(garageDoor) 
     } 
     else { 
      print("image not ready!") 
     } 
    } 

} 

Ich möchte nur ein UIImageView mit einem Bild garagedoorclosed Namen initialisieren.

Ich habe keine Ahnung, warum ich garageDoor mit garageDoor = UIImageView(image: image) nicht initialisieren konnte.

Mein Bild unten:

enter image description here

Alle Kommentare wird geschätzt!

Dank

Antwort

1

Ich bearbeite meine Antwort. Das Hauptproblem ist die Deklaration von garageDoor, weil weak bedeutet, dass Variable das Objekt nicht behält und es wird freigegeben. Sie haben entfernen weak und garageDoor wird stark sein.

var garageDoor: UIImageView! 

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 

    if let image = UIImage(named: "images2") { 
     print("image ready: \(image)") 

     garageDoor = UIImageView(image: image) 

     print("garageDoor: \(garageDoor)") 

     garageDoor.frame = CGRectMake(0, 0, 560, 400) 
     view.addSubview(garageDoor) 
    } 
    else { 
     print("image not ready!") 
    } 
} 

Faustregel, um zu entscheiden, welche der beiden Referenzen schwach sein sollte:

denken Sie an den Objekten im Zyklus beibehalten, wie in einer Eltern-Kind-Beziehung zu sein. In dieser Beziehung sollte der Elternteil eine starke Referenz (d. H. Besitz an seinem Kind) beibehalten, aber das Kind sollte nicht eine starke Referenz pflegen.

+0

Ja, das macht den Trick! Verwenden Sie Ihre Methode erneut, aber nachdem ich garageDoor initialisiert habe, weise ich sie der Instanzvariablen zu, dann übergibt sie den Fehler! Sie haben eine Erklärung für diesen seltsamen Fall? Ist das ein Fehler von UIImageView? – quanguyen

+1

Es ist kein Fehler UIImageView. Dies hängt mit dem Konzept von stark und schwach zusammen. Ich werde es in meiner Antwort erklären – David

1

in viewDidLoad nur den Code unten ersetzen.

var garageDoor: UIImageView! 

garageDoor = UIImageView(frame: CGRectMake(0, 0, 560, 400)) 
if let image = UIImage(named: "garagedoorclosed") { 
    garageDoor.image = image 
} 

self.view.addSubview(garageDoor)