代码之家  ›  专栏  ›  技术社区  ›  four-eyes

设置IBoutlet的属性

  •  3
  • four-eyes  · 技术社区  · 6 年前

    我通过Draggin和Dropping 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 回复  |  直到 6 年前
        1
  •  5
  •   Ashley Mills    6 年前

    你要做的是一个完全可以接受的方法来建立一个 @IBOutlet 的属性只是不引用其他属性 @伊博特莱特 或主视图等,因为这可能会强制主视图提前加载。

    您只需要将代码包装在 didSet 方块_

    @IBOutlet weak var imageView: UIImageView! {    
        didSet {
            imageView.contentMode = .scaleToFill
            imageView.clipsToBounds = true
        }    
    }
    
        2
  •  2
  •   Scriptable    6 年前

    一个出口基本上只是一个到故事板中那个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
    }
    

    我不能设置上述任何值。2和3是let only(只读常量),5是计算属性,所以我也只能读取它。我不会使事情进一步复杂化,但我强烈建议将 documentation 一本你能读的书。

    解决方案

    您应该只有一个插座:

    @IBOutlet weak var imageView: UIImageView!
    

    然后在代码中的其他地方,您可以用它来做一些事情。

    我认为在你的情况下,最好是在viewdidload上。在设置视图及其所有出口和属性之后调用viewdidload。所以这是一个安全的地方,可以开始使用您的插座来进一步配置您的视图。

    override func viewDidLoad() {
        super.viewDidLoad()
    
        self.imageView.contentMode = .scaleToFill
        self.imageView.clipsToBounds = true
    }
    
        3
  •  0
  •   AVerguno    6 年前

    首先,它是 很好的方法来超越出口的吸气剂。 其次,从技术上讲,您可以覆盖出口的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中的递归。

        4
  •  0
  •   lpd    6 年前

    只需以这种方式尝试并在viewdidlod()内调用此方法

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