我通过draggin&创建了一个出口将UIImageView
放入ViewController.swift
文件
@IBOutlet weak var imageView: UIImageView!
我想将imageView
的属性设置为
imageView.contentMode = .scaleToFill
imageView.clipsToBounds = true
这样做
@IBOutlet weak var imageView: UIImageView! {
self.imageView.contentMode = .scaleToFill
self.imageView.clipsToBounds = true
}
XCode抱怨
@IBOutlet属性要求属性是可变的
我如何继续这个?
答案 0 :(得分:5)
您要做的是设置@IBOutlet
属性的完全可接受的方式...只是不要引用其他@IBOutlet
或主视图等,因为这可能会强制主视图加载比预期更早。
您只需将代码包装在didSet
块中......
@IBOutlet weak var imageView: UIImageView! {
didSet {
imageView.contentMode = .scaleToFill
imageView.clipsToBounds = true
}
}
答案 1 :(得分:2)
插座基本上只是故事板中该UI元素的链接。
因此,您将故事板中的UIImageView
链接到UIViewController代码中的元素,然后您可以在加载后访问和更改该元素的属性。
问题
执行此操作的语法错误:
@IBOutlet weak var imageView: UIImageView! {
self.imageView.contentMode = .scaleToFill
self.imageView.clipsToBounds = true
}
出现以下错误的原因
@IBOutlet属性要求属性是可变的
是...在属性声明充当getter之后有一个闭包。作为一个例子,我可以做到这一点
let two = 2
let three = 3
var five: Int {
return two + three
}
我无法设置上述任何值。两个和三个只允许(只读常量),五个是计算属性,所以我也只能读它。我不会进一步使问题复杂化,但我强烈建议你尽可能阅读这部分documentation。
<强>解决方案强>
你应该只有一个出口:
@IBOutlet weak var imageView: UIImageView!
然后在代码中的其他地方你可以用它做事。
我认为在你的情况下,它最适合viewDidLoad。在视图之后调用ViewDidLoad,并设置其所有出口和属性。因此,这是一个安全的地方,可以开始使用您的商店进一步配置您的观点。
override func viewDidLoad() {
super.viewDidLoad()
self.imageView.contentMode = .scaleToFill
self.imageView.clipsToBounds = true
}
答案 2 :(得分:0)
首先,它是不超越插座吸气器的好方法。 其次,从技术上讲,你可以覆盖出口的getter和setter。
在你的情况下你定义了getter,忘记了setter。所以你得到get only
变量。
private var _someView: UIImageView!
@IBOutlet weak var someView: UIImageView! {
get {
self.someView.contentMode = .scaleToFill
self.someView.clipsToBounds = true
return _someView
}
set {
_someView = newValue
}
}
你应该使用私有变量来避免getter中的递归。
答案 3 :(得分:0)
只需尝试这种方式并在viewDidLod()
中调用此方法func createRoundGreenImage(imageView : UIImageView, with image :
String) {
self.imageView.contentMode = .scaleToFill
self.imageView.clipsToBounds = true
}