私がしたこと:派生データの削除、xcodeの再起動、エディター-> Refresh all views
Editor-> Refresh all views
をクリックすると、ストーリーボードでDesignables
ビルドが失敗します。
次のコードを確認してください。私は何が欠けていますか?属性インスペクターから@IBInspectableの値を変更すると、ストーリーボードでTextfiledが更新されません。
import UIKit
import QuartzCore
@IBDesignable
class BorderedFloatingTF: UITextField {
required init?(coder aDecoder:NSCoder) {
super.init(coder:aDecoder)
setup()
}
override init(frame:CGRect) {
super.init(frame:frame)
setup()
}
override func textRect(forBounds bounds: CGRect) -> CGRect {
return bounds.insetBy(dx: 20, dy: 0)
}
override func editingRect(forBounds bounds: CGRect) -> CGRect {
return textRect(forBounds: bounds)
}
override func prepareForInterfaceBuilder() {
super.prepareForInterfaceBuilder()
setup()
}
// properties..
@IBInspectable var enableTitle : Bool = false
@IBInspectable var borderColor: UIColor = UIColor.white {
didSet {
layer.borderColor = borderColor.cgColor
}
}
@IBInspectable var borderWidth: Int = 1 {
didSet {
layer.borderWidth = CGFloat(borderWidth)
}
}
@IBInspectable var placeHolderColor: UIColor = UIColor.white {
didSet {
self.attributedPlaceholder = NSAttributedString(string:self.placeholder != nil ? self.placeholder! : "", attributes:[NSForegroundColorAttributeName: placeHolderColor])
}
}
fileprivate func setup() {
borderStyle = UITextBorderStyle.none
layer.borderWidth = CGFloat(borderWidth)
layer.borderColor = borderColor.cgColor
placeHolderColor = UIColor.white
}
}
これを試して
import QuartzCore
@IBDesignable
class BorderedFloatingTF: UITextField {
required init?(coder aDecoder:NSCoder) {
super.init(coder:aDecoder)
setup()
}
override init(frame:CGRect) {
super.init(frame:frame)
setup()
}
override func textRect(forBounds bounds: CGRect) -> CGRect {
return bounds.insetBy(dx: 20, dy: 0)
}
override func editingRect(forBounds bounds: CGRect) -> CGRect {
return textRect(forBounds: bounds)
}
// properties..
@IBInspectable var enableTitle : Bool = false
@IBInspectable var borderColor: UIColor = UIColor.white {
didSet {
layer.borderColor = borderColor.cgColor
}
}
@IBInspectable var borderWidth: Int = 1 {
didSet {
layer.borderWidth = CGFloat(borderWidth)
}
}
@IBInspectable var placeHolderColor: UIColor = UIColor.white {
didSet {
self.attributedPlaceholder = NSAttributedString(string:self.placeholder != nil ? self.placeholder! : "", attributes:[NSForegroundColorAttributeName: placeHolderColor])
}
}
func setup() {
borderStyle = UITextBorderStyle.none
layer.borderWidth = CGFloat(borderWidth)
layer.borderColor = borderColor.cgColor
placeHolderColor = UIColor.white
}
}
IBDesignables
とIBInspectables
の両方が正常に機能しています。
Xibからのカスタムクラスのロードでこの問題が発生しました。最後に、このソリューションにつまずきました(Bundle.mainではなく、クラスに正しいバンドルを使用する必要がありました):
@IBDesignable
class DataEntryView: UIView {
@IBOutlet var contentView: DataEntryView!
@IBInspectable var hasError : Bool = false
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
self.commonInit()
}
override init(frame: CGRect) {
super.init(frame: frame)
self.commonInit()
}
private func commonInit() {
let bundle = Bundle.init(for: type(of: self))
bundle.loadNibNamed("DataEntryView", owner: self, options: nil)
addSubview(contentView)
contentView.translatesAutoresizingMaskIntoConstraints = false
contentView.topAnchor.constraint(equalTo: self.topAnchor, constant: 0).isActive = true
contentView.leftAnchor.constraint(equalTo: self.leftAnchor, constant: 0).isActive = true
contentView.rightAnchor.constraint(equalTo: self.rightAnchor, constant: 0).isActive = true
contentView.bottomAnchor.constraint(equalTo: self.bottomAnchor, constant: 0).isActive = true
}
}
プロジェクトでも同じ問題がありました。この問題を解決するために、次の手順を実行しました。
カスタムIBDesignableビューで、必ず両方のメソッドをオーバーライドしてください
required init?(coder aDecoder: NSCoder)
override init(frame: CGRect)
ビルド設定のRunpath検索パスに以下を追加します
@loader_path/Frameworks
$(CONFIGURATION_BUILD_DIR)
プロジェクトをクリーンアップし、派生データを削除します。
それはすべてうまくいくはずです。
私のプロジェクトでは、値のタイプを設定するために欠落していました。あなたの問題はそれについてではありません。しかし、私と同じ問題を抱えている他の人々のために、私は説明したかった。
例:私は以下のように書いていました:
@IBInspectable public var rowOrColoumnCount = 0
しかし、次のようになっているはずです。
@IBInspectable public var rowOrColoumnCount : Int = 0
[モジュール]フィールドで指定された正しいモジュールかどうかを確認します。現在は「Template1」と指定されていますが、正しいですか?また、すべての@IBInspectableプロパティをパブリックにするようにしてください
この部分だけを残すようにしてください:
@IBDesignable
class BorderedFloatingTF: UITextField {
// properties..
@IBInspectable var enableTitle : Bool = false
@IBInspectable var borderColor: UIColor = UIColor.white {
didSet {
layer.borderColor = borderColor.cgColor
}
}
@IBInspectable var borderWidth: Int = 1 {
didSet {
layer.borderWidth = CGFloat(borderWidth)
}
}
@IBInspectable var placeHolderColor: UIColor = UIColor.white {
didSet {
self.attributedPlaceholder = NSAttributedString(string:self.placeholder != nil ? self.placeholder! : "", attributes:[NSForegroundColorAttributeName: placeHolderColor])
}
}
}