Я пытаюсь использовать файл xib для создания повторно используемого компонента (несколько раз в одном и том же представлении), и все было в порядке, пока я не захотел обновить некоторые элементы управления из свойства @IBInspectable
.Я обнаружил, что @IBOutlet
не установлены в этот момент, поэтому я выполнил поиск и нашел что-то
http://justabeech.com/2014/07/27/xcode-6-live-rendering-from-nib/
Он сохраняет загруженный вид в proxyView, чтобы вы моглииспользуйте его в @IBInspectable
.К сожалению, этот код немного стар и не работает как есть.Но моя проблема в том, что когда я пытаюсь загрузить перо как класс, оно не работает.Это работает, только если я загружаю его как UIView
.
Эта строка не работает как эта
return bundle.loadNibNamed("test", owner: nil, options: nil)?[0] as? ValidationTextField
Она работает только тогда, когда это так
return bundle.loadNibNamed("test", owner: nil, options: nil)?[0] as? UIView
Я думаю,проблема в том, что владелец файла xib помечен как ValidationTextField
, но основной вид - UIView
.Поэтому, когда вы загружаете перо, оно приносит UIView
, которое, очевидно, не имеет пользовательских свойств или выходов.
Во многих примерах о загрузке файлов XIB говорится, что класс должен находиться в владельце файла.Так что я не знаю, как получить пользовательский класс, используя это.
import UIKit
@IBDesignable class ValidationTextField: UIView {
@IBOutlet var lblError: UILabel!
@IBOutlet var txtField: XTextField!
@IBOutlet var imgWarning: UIImageView!
private var proxyView: ValidationTextField?
override init(frame: CGRect) {
super.init(frame: frame)
}
required init(coder: NSCoder) {
super.init(coder: coder)!
}
override func awakeFromNib() {
super.awakeFromNib()
xibSetup()
}
override func prepareForInterfaceBuilder() {
super.prepareForInterfaceBuilder()
xibSetup()
self.proxyView?.prepareForInterfaceBuilder()
}
func xibSetup() {
guard let view = loadNib() else { return }
view.frame = bounds
view.autoresizingMask = [.flexibleWidth, .flexibleHeight]
addSubview(view)
// Saving the view in a variable
self.proxyView = view
}
func loadNib() -> ValidationTextField? {
let bundle = Bundle(for: type(of: self))
return bundle.loadNibNamed("test", owner: nil, options: nil)?[0] as? ValidationTextField
}
@IBInspectable var fontSize: CGFloat = 14.0 {
didSet {
let font = UIFont(name: "System", size: self.fontSize)
self.proxyView!.txtField.font = font
self.proxyView!.lblError.font = font
}
}
}
Я даже не знаю, будет ли работать все остальное.Если то, что ссылка говорит, что это правда, то получение представления после загрузки пера позволит мне получить доступ к розеткам.
Запуск этого кода завершится ошибкой в этой строке
guard let view = loadNib() else { return }
Я думаю, что это можетНе конвертируйте UIView
в класс, чтобы он возвращал ноль, а затем завершал работу.
Моя цель - создать компонент многократного использования, который можно много раз разместить в одном контроллере.И сможете увидеть его дизайн в раскадровке.