web-dev-qa-db-ja.com

iOSで@IBDesignableが機能しないSwift 3

私がしたこと:派生データの削除、xcodeの再起動、エディター-> Refresh all views

Editor-> Refresh all viewsをクリックすると、ストーリーボードでDesignablesビルドが失敗します。

enter image description here

次のコードを確認してください。私は何が欠けていますか?属性インスペクターから@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
    }
}
15

これを試して

![enter image description here

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
    }
}

IBDesignablesIBInspectablesの両方が正常に機能しています。

7
Krunal

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
}
}
5
Anthony Scott

プロジェクトでも同じ問題がありました。この問題を解決するために、次の手順を実行しました。

カスタムIBDesignableビューで、必ず両方のメソッドをオーバーライドしてください

required init?(coder aDecoder: NSCoder)
override init(frame: CGRect)

ビルド設定のRunpath検索パスに以下を追加します

@loader_path/Frameworks
$(CONFIGURATION_BUILD_DIR)

プロジェクトをクリーンアップし、派生データを削除します。

それはすべてうまくいくはずです。

4
Ilker Baltaci

私のプロジェクトでは、値のタイプを設定するために欠落していました。あなたの問題はそれについてではありません。しかし、私と同じ問題を抱えている他の人々のために、私は説明したかった。

例:私は以下のように書いていました:

@IBInspectable public var rowOrColoumnCount = 0

しかし、次のようになっているはずです。

@IBInspectable public var rowOrColoumnCount : Int = 0
1

[モジュール]フィールドで指定された正しいモジュールかどうかを確認します。現在は「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])
    }
}

}

0
Anton Novoselov