4

我正在制作一个演示以了解 @IBInspectable 的工作原理。

首先,我在 UIViewController 子类中创建了两个变量:

  @IBInspectable var intTest:Int = 10
  @IBInspectable var flag:Bool = false

这样它就会出现在情节提要中。之后,我在情节提要中更改这些变量的值:

在此处输入图像描述

然后,我尝试在“viewDidLoad()”方法中打印这些变量,如下所示:

  override func viewDidLoad() {
       super.viewDidLoad()
       // Do any additional setup after loading the view, typically from a nib.
       print("intTest value: \(String(describing: intTest))")
       print("flag value: \(String(describing: flag)))")
  }

输出是:

intTest 值:90

标志值:真

它工作正常,除非我更改变量声明,例如,

  @IBInspectable var intTest:Int? = 10
  @IBInspectable var flag:Bool? = false

之后,我在情节提要中更改了与上面相同的值,但值没有更改。

输出是:

intTest 值:可选(10)

标志值:可选(假)

所以我的问题是,为什么当我将变量声明为可选时值没有更新?

另一件事是,当我将变量作为字符串时,值会更新。谁能帮我理解这个功能?

4

2 回答 2

4

设置可选值IBInspectablevar

@IBInspectable var placeHolderImage:UIImage? {
     didSet {
         leftViewSetting()
     }
 }

设置默认值IBInspectablevar

@IBInspectable var placeHolderImage:UIImage = UIImage() {
    didSet {
        leftViewSetting()
    }
}

使用这种方法,每次更改 Interface Builder 中的值时,您的视图都会更新。

@IBInspectable var cornerRadius: CGFloat {
    get {
       return layer.cornerRadius
    }
    set {
       layer.cornerRadius = newValue
    }
}
于 2017-05-04T05:21:48.907 回答
0

您可以将其声明为可选项,并且效果很好。只需调整您的代码如下:

 @IBInspectable var intTest: Int? {
        didSet {
            self.intTestTweak = intTest
        }
  }

willSet并在这里didSet解释。

于 2017-05-04T05:10:42.513 回答