2016-08-02 77 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) 
相关问题