Swift 2.2 - 以编程方式初始化UIImageView的正确方法
问题描述:
我刚刚被这个非常简单的代码(我从项目中分离出来)的失败所淹没。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。
我不知道为什么我没有初始化garageDoor
与garageDoor = UIImageView(image: image)
。
我下面的截图:
任何意见表示赞赏!
谢谢
答
我编辑我的答案。主要问题是garageDoor
的声明,因为weak
意味着该变量不保留该对象,并且它将被解除分配。您已删除weak
和garageDoor
会很强。
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。
答
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)
是的,这是诀窍!重新使用你的方法,但初始化garageDoor后,我把它分配回实例变量,然后它通过错误!你对这个奇怪的案例有任何解释吗?这是UIImageView的错误吗? – quanguyen
这不是一个错误的UIImageView。这与强和弱的概念有关。我会在我的回答中解释 – David