设置IBOutlet的财产

时间:2018-05-23 09:56:04

标签: ios iphone swift xcode

我通过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属性要求属性是可变的

我如何继续这个?

4 个答案:

答案 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
}