设置IBOutlet的属性

5

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

我该怎么办?


3
为什么不在故事板中设置这些属性? - Mihai Fratu
4个回答

11

你正在尝试设置一个@IBOutlet的属性,这是完全可以接受的方式...只是不要引用其他@IBOutlet或主视图等内容,因为这可能会比预期提前加载主视图。

你只需要在didSet块中包装你的代码...

@IBOutlet weak var imageView: UIImageView! {    
    didSet {
        imageView.contentMode = .scaleToFill
        imageView.clipsToBounds = true
    }    
}

1
一个outlet基本上只是指向storyboard中UI元素的链接。
因此,您可以将storyboard中的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
}

我不能设置以上任何一个值。两个和三个是只读常量,而五是计算属性,因此我也只能读取它。我不想让事情变得更加复杂,但我强烈建议您在有时间时阅读文档 的这一部分。

解决方案

你应该只有一个outlet:

@IBOutlet weak var imageView: UIImageView!

然后在代码的其他地方,您可以对其进行操作。

我认为在viewDidLoad中最好。ViewDidLoad在视图及其所有插座和属性设置之后被调用。因此,这是一个安全的地方,可以使用您的插座进一步配置视图。

override func viewDidLoad() {
    super.viewDidLoad()

    self.imageView.contentMode = .scaleToFill
    self.imageView.clipsToBounds = true
}

0
首先,覆盖 outlet 的 getter 不是一个好的方法。 其次,从技术上讲,您可以覆盖 outlet 的 getter 和 setter。
在您的情况下,您定义了 getter,但忘记了 setter。因此,您得到了一个只有“获取”功能的变量。
    private var _someView: UIImageView!

    @IBOutlet weak var someView: UIImageView! {
    get {
        self.someView.contentMode = .scaleToFill
        self.someView.clipsToBounds = true
        return _someView
    }
    set {
        _someView = newValue
    }
}

你应该使用私有变量来避免getter中的递归。


0

尝试这种方式,并在viewDidLoad()中调用此方法。

func createRoundGreenImage(imageView : UIImageView, with image : 
String) {
self.imageView.contentMode = .scaleToFill
self.imageView.clipsToBounds = true
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接