2016-11-12 2 views
6

Кажется, что не работает атрибут IBTML. У меня есть простой вид каркаса с UILabel, который я создаю переменную IBInspectable «titleText». Я отмечаю, что проверяемые переменные «layer» работают так, как ожидалось, но не мой пользовательский «titleText», который должен обновить основное представление с использованием этой структуры.IBInspectable с Cocoa Touch Framework не работает? (код прилагается)

вопросы:

  1. Interface Builder не обновляя titleLabel? (то есть во время разработки), то есть я ожидаю, что это должно быть так же, как и для элементов «слоя».

  2. Во время выполнения значение titleLabel не подбирает значение, установленное в IB. Обратите внимание, что я получаю следующий вывод, когда я запускаю, т. Е. Мой код, который производит это, находит «self.titleLabel» на самом деле нуль?

КОД СУЩНОСТЬ

enter image description here

(а) gcCustomView.xib Снимок enter image description here

(б) gcCustomerView.swift

import UIKit 

@IBDesignable 
class gcCustomView: UIView { 

    @IBOutlet weak var titleLabel: UILabel! 
    @IBInspectable var titleText: String = "Default" { 
     didSet { 
      if self.titleLabel != nil { 
       self.titleLabel.text = titleText 
      } else { 
       NSLog("Could not set title text as label.text was nil : was trying to set to \(titleText)") 
      } 
     } 
    } 


    @IBInspectable var cornerRadius: CGFloat = 0 { 
     didSet { 
      layer.cornerRadius = cornerRadius 
      layer.masksToBounds = cornerRadius > 0 
     } 
    } 
    @IBInspectable var borderWidth: CGFloat = 0 { 
     didSet { 
      layer.borderWidth = borderWidth 
     } 
    } 
    @IBInspectable var borderColor: UIColor? { 
     didSet { 
      layer.borderColor = borderColor?.cgColor 
     } 
    } 


    override init(frame: CGRect) { 
     super.init(frame: frame) 
     commitInit() 
    } 

    required init?(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
     commitInit() 
    } 

    // Private 

    func commitInit() { 
     if self.subviews.count == 0 { 
      print("Loading Nib") 
      //let bundle = Bundle(forClass: self.dynamicType) 
      let bundle = Bundle(for: type(of: self)) 
      let nib = UINib(nibName: "gcCustomView", bundle: bundle) 
      let view = nib.instantiate(withOwner: self, options: nil)[0] as! UIView 
      view.frame = bounds 
      view.autoresizingMask = [.flexibleWidth, .flexibleHeight] 
      addSubview(view) 
     } 
    } 

} 

(с) Main.storyboard Снимок

enter image description here

ответ

4

Выбрать gcCustomView.xibFile's Owner изменить название категории до gcCustomerView.

enter image description here

правой кнопкой мыши на Label сопротивления от outlet до File Owner

enter image description here

Теперь он должен выглядеть, если вы щелкните правой кнопкой мыши Label

enter image description here

Я сделал демонстрационный проект. Он работает нормально. Если у вас все еще есть проблемы, дайте мне знать. Я загружу свой демо-проект в Github.

+1

большое спасибо - этот ответ выравнивает лучшее, где я поступил не так, и задокументировал, как исправить ситуацию – Greg

2

, если вы хотите использовать XIB убедитесь, что вы установили имя класса в FileOwner

, чтобы сделать первый

enter image description here

Теперь добавьте имя класса

enter image description here

И добавить IBOutlet

Reuse a uiview xib in storyboard см

+0

Я добавил файла, но это не помогло ... Я просмотрю ссылку, которую вы отправили – Greg

2

Это память issue.Label не имеет памяти здесь. Поэтому он возвращает 0 Вместо того, чтобы загружать nib в пользовательский класс, вы должны загрузить его в ViewController. Замените свой gcCustomView на следующий код.

gcCustomView.swift

import UIKit 

@IBDesignable 
class gcCustomView: UIView { 

    @IBOutlet weak var titleLabel: UILabel! 

    override func awakeFromNib() { 
     super.awakeFromNib() 
     // Initialization code 
     if self.titleLabel != nil { 
      self.titleLabel.text = "Default" 
     } 
     else { 
      NSLog("Could not set title text as label.text was nil : was trying to set to default") 
     } 
    } 
    @IBInspectable var cornerRadius: CGFloat = 0 { 
     didSet { 
      layer.cornerRadius = cornerRadius 
      layer.masksToBounds = cornerRadius > 0 
     } 
    } 
    @IBInspectable var borderWidth: CGFloat = 0 { 
     didSet { 
      layer.borderWidth = borderWidth 
     } 
    } 
    @IBInspectable var borderColor: UIColor? { 
     didSet { 
      layer.borderColor = borderColor?.cgColor 
     } 
    } 
    override init(frame: CGRect) { 
     super.init(frame: frame) 
     // commitInit() 
    } 

    required init?(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
     // commitInit() 
    } 
} 

ViewController.swift

import UIKit 

class ViewController: UIViewController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 
     self.loadNib() 

    } 
    func loadNib() { 
     let obj = Bundle.main.loadNibNamed("gcCustomView", owner: nil, options: nil)?[0] as! gcCustomView 
     obj.frame = (self.view.bounds) 
     self.view.addSubview(obj) 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 
} 

Затем построить. Это будет работать.

0

Удалить параметр Keypath в пользовательском представлении и запустить. Он работал для меня. :)

Смежные вопросы