web-dev-qa-db-de.com

@IBDesignable funktioniert nicht in iOS Swift 3

Was ich getan habe: Abgeleitete Daten gelöscht, Neustart xcode, Editor -> Refresh all views

Ich bekomme Designables build im Storyboard fehlgeschlagen, wenn ich auf Editor -> Refresh all views klicke. 

 enter image description here

Bitte überprüfen Sie den folgenden Code. Was vermisse ich? Textfiled wird im Storyboard nicht aktualisiert, wenn ich den @IBInspectable-Wert im Attribut-Inspector ändere.

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

Versuche dies

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

Ihre IBDesignables & IBInspectables funktionieren beide einwandfrei.

7
Krunal

Ich hatte dieses Problem mit einer benutzerdefinierten Klasse, die von einem Xib geladen wurde. Schließlich über diese Lösung gestolpert (musste das richtige Paket für die Klasse anstelle von Bundle.main verwenden):

@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

Ich hatte das gleiche Problem bei einem Projekt. Ich habe die folgenden Schritte ausgeführt, um das Problem zu beheben.

Stellen Sie sicher, dass Sie in der benutzerdefinierten IBDesignable-Ansicht beide Methoden überschreiben

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

Fügen Sie Folgendes zu Ihren Runpath-Suchpfaden in den Build-Einstellungen hinzu

@loader_path/Frameworks
$(CONFIGURATION_BUILD_DIR)

Bereinigen Sie Ihr Projekt, löschen Sie abgeleitete Daten.

Das sollte alles in Ordnung sein.

4
Ilker Baltaci

In meinem Projekt fehlte mir die Einstellung des Wertes Type. Ihr Problem ist nicht das Problem. Aber für andere Leute, die das gleiche Problem mit mir haben, wollte ich erklären.

Beispiel: Ich schrieb wie folgt: 

@IBInspectable public var rowOrColoumnCount = 0

Aber es hätte sein sollen:

@IBInspectable public var rowOrColoumnCount : Int = 0
1

Prüfen Sie, ob es korrekt ist. Modul im Feld "Modul" angegeben. Es ist jetzt "Template1" angegeben, ist es richtig? Versuchen Sie auch, alle @IBInspectable-Eigenschaften als öffentlich zu machen

Versuche nur diesen Teil zu verlassen:

@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