【问题标题】:Set property of IBOutlet设置 IBOutlet 的属性
【发布时间】:2018-05-23 09:56:04
【问题描述】:

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

我该怎么做?

【问题讨论】:

  • 为什么不在情节提要中设置这些属性?

标签: ios iphone swift xcode


【解决方案1】:

您尝试做的是一种完全可以接受的方式来设置 @IBOutlet 的属性……只是不要引用其他 @IBOutlets 或主视图等,因为这可能会强制主视图加载时间早于预期。

您只需将代码包装在 didSet 块中...

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

【讨论】:

    【解决方案2】:

    插座基本上只是故事板中该 UI 元素的链接。

    因此,您将情节提要中的 UIImageView 链接到 UIViewController 代码中的元素,然后您可以在加载该元素后访问和更改该元素的属性。

    问题

    这是错误的语法:

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

    出现如下错误的原因

    @IBOutlet 属性要求属性是可变的

    is.. 在属性声明之后有一个闭包充当 getter。作为一个例子,我可以这样做

    let two = 2
    let three = 3
    
    var five: Int {
       return two + three
    }
    

    我无法设置上述任何值。二和三只允许(只读常量),五是计算属性,所以我也只能读取它。我不会让事情进一步复杂化,但我强烈建议您尽可能阅读 documentation 的这一部分。

    解决方案

    你应该只有一个插座:

    @IBOutlet weak var imageView: UIImageView!
    

    然后在代码的其他地方你可以用它来做事。

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

    override func viewDidLoad() {
        super.viewDidLoad()
    
        self.imageView.contentMode = .scaleToFill
        self.imageView.clipsToBounds = true
    }
    

    【讨论】:

      【解决方案3】:

      首先,覆盖插座的吸气剂不是好方法。 其次,从技术上讲,您可以覆盖插座的 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】:

        就这样试试,在viewDidLod()里面调用这个方法

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-08-28
          • 1970-01-01
          • 1970-01-01
          • 2011-12-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多