Почему IBInspectable не устанавливает значение для дополнительной переменной из раскадровки?

Я делаю демонстрацию, чтобы узнать, как работает @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)

значение флага: необязательно (ложь)

Итак, мой вопрос: почему значение не обновляется, когда я объявляю переменную необязательной?

Другое дело, когда я беру переменную в виде строки, значение обновляется. Может ли кто-нибудь помочь мне понять эту функцию?


person vikas prajapati    schedule 04.05.2017    source источник


Ответы (2)


Установить необязательное значение IBInspectable var

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

Установить значение по умолчанию IBInspectable var

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

Используя этот подход и каждый раз, когда вы меняете значение в Interface Builder`, ваше представление будет обновляться.

@IBInspectable var cornerRadius: CGFloat {
    get {
       return layer.cornerRadius
    }
    set {
       layer.cornerRadius = newValue
    }
}
person Harshal Valanda    schedule 04.05.2017
comment
Я знаю, что когда мы объявляем переменную как необязательную, значение не обновляется, но мой вопрос: почему? - person vikas prajapati; 04.05.2017
comment
@IBInspectable var placeHolderImage:UIImage? я меняю переменную IBInspectable на опцию, которая работает нормально. Обновите свой вопрос с помощью проектируемого класса. - person Harshal Valanda; 04.05.2017
comment
Да, я обнаружил, что изображение обновляется так же, как String. Но мой вопрос: почему значения Int и Bool не обновляются? - person vikas prajapati; 04.05.2017

Вы можете объявить его необязательным, и он хорошо работает. Просто настройте свой код, как показано ниже:

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

willSet и didSet объясняются здесь.

person ankit    schedule 04.05.2017