Пользовательский элемент управления Swift не отображается при использовании в контроллере представления (код прилагается)

Когда я пытаюсь использовать этот пользовательский элемент управления в своем контроллере основного представления, перетаскивая UIView на экран в IB и устанавливая для него значение «CustomerControlView», он фактически не показывает его.

Вопрос. Что не так с кодом, который у меня есть?

Предыстория. Итак, я хочу в основном: а) разработать элемент управления клиента в IB, б) поэтому я предполагаю, что создаю файл NIB, а затем создаю файл UIView, так что это то, что я сделал

Скриншот NIB и файла swift

введите здесь описание изображения Код

import UIKit

class CustomControlView: UIView {

//    @IBOutlet var icon: UIImageView!
//    @IBOutlet weak var view: UIView!

    @IBOutlet weak var button: UIButton!
    @IBOutlet weak var text1: UITextField!
    @IBOutlet weak var text2: UITextField!

    override init(frame: CGRect) {
        print("override init(frame: CGRect) ")
        super.init(frame: frame)
    }

    required init?(coder aDecoder: NSCoder) {
        print("required init?(coder aDecoder: NSCoder)")
        super.init(coder: aDecoder)

//        let arr = NSBundle.mainBundle().loadNibNamed("CustomControlView", owner: nil, options: nil)
//        let v = arr[0] as! UIView
//        self.view.addSubview(v)
    }


}

Снимок, показывающий, как я включил пользовательское представление в свое основное представление viewController:

введите здесь описание изображения


person Greg    schedule 30.09.2015    source источник


Ответы (1)


Просто добавьте @IBDesignable над строкой класса, чтобы указать Xcode скомпилировать его перед отображением в раскадровке. На эту тему есть большое обсуждение здесь: http://nshipster.com/ibinspectable-ibdesignable/

Также вам необходимо убедиться, что NIB загружается:

override init(frame: CGRect) {
    print("override init(frame: CGRect) ")
    super.init(frame: frame)
    xibSetup()
}

required init?(coder aDecoder: NSCoder) {
    print("required init?(coder aDecoder: NSCoder)")
    super.init(coder: aDecoder)

    xibSetup()

}


func xibSetup() {
    view = loadViewFromNib()
    view.frame = bounds
    view.autoresizingMask = [.FlexibleWidth, .FlexibleHeight]
    addSubview(view)
}

func loadViewFromNib() -> UIView {
    let bundle = NSBundle(forClass: self.dynamicType)
    let nib = UINib(nibName: "CustomNumberPad", bundle: bundle)
    let view = nib.instantiateWithOwner(self, options: nil)[0] as! UIView
    return view
}
person Mika    schedule 30.09.2015
comment
спасибо - не могу проверить это в данный момент, однако я хотел указать, что он не показывает элемент управления, когда я запускаю сам проект (т.е. не только отображение в вопросе IB). Имеет ли это смысл? - person Greg; 01.10.2015
comment
@Milka - это выдает ошибку EXC_BAD_ACCESS, при этом код неоднократно вызывает требуемый метод init? (coder aDecoder: NSCoder), поскольку я вижу вывод на печать в консоли. Есть идеи, как это исправить? - person Greg; 01.10.2015
comment
Я нашел здесь blog.boxuanzhang.me/custom-reusable-uiview-with- xib есть обходной путь, вставив проверку if self.subview.count == 0 { в xibSetup, чтобы он работал. Интересно, есть ли лучший способ? - person Greg; 01.10.2015
comment
на самом деле только что опубликовал отдельный вопрос о том, есть ли здесь лучший способ: stackoverflow.com/questions/32877816/ - person Greg; 01.10.2015
comment
Извините, я спал прошлой ночью... У меня точно такой же код для многих проектов и элементов управления, и у меня никогда не было этой проблемы с циклом... Давайте попробуем это исправить: (1) Вы добавили @IBDesignable class CustomControlView? (2) как вы используете элемент управления? - person Mika; 01.10.2015
comment
ой, пропустил твой ответ. На самом деле я решил, что это слишком утомительно (учитывая, что я только начинаю работать с IOS), пытаясь исправить все проблемы, связанные с попыткой реализовать повторно используемые компоненты. Я только что объединил вещи обратно в одну раскадровку и контроллер просмотра, чтобы продолжить работу. Не уверен, что я должен принять ваш ответ поэтому? У меня не было других проблем, например. blog.boxuanzhang.me/custom-reusable-uiview-with-xib - person Greg; 19.10.2015