2016-08-02 123 views
0

我剛剛被這個非常簡單的代碼(我從項目中分離出來)的失敗所淹沒。Swift 2.2 - 以編程方式初始化UIImageView的正確方法

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!") 
     } 
    } 

} 

我只想用名爲garagedoorclosed的圖像初始化UIImageView。

我不知道爲什麼我沒有初始化garageDoorgarageDoor = UIImageView(image: image)

我下面的截圖:

enter image description here

任何意見表示讚賞!

謝謝

回答

1

我編輯我的答案。主要問題是garageDoor的聲明,因爲weak意味着該變量不保留該對象,並且它將被解除分配。您已刪除weakgarageDoor會很強。

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!") 
    } 
} 

經驗法則來決定這兩個引用應該是弱:

想到的對象在保留週期的父子關係之中。在這種關係中,父母應該對孩子保持強有力的參照(即所有權),但孩子不應該保持強烈的參照 original link

+0

是的,這是訣竅!重新使用你的方法,但初始化garageDoor後,我把它分配回實例變量,然後它通過錯誤!你對這個奇怪的案例有任何解釋嗎?這是UIImageView的錯誤嗎? – quanguyen

+1

這不是一個錯誤的UIImageView。這與強和弱的概念有關。我會在我的回答中解釋 – David

1

in viewDidLoad只是替換下面的代碼。

var garageDoor: UIImageView! 

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

self.view.addSubview(garageDoor) 
相關問題