2015-01-22 6 views
8

Ich habe eine Unterklasse von UIView namens MyView, die ich erstelle.Verwenden von IBDesignable und prepareForInterfaceBuilder mit einem UILabel

Darin gibt es eine UILabel (dies ist in Code nicht in InterfaceBuilder aus Gründen hinzugefügt).

Ich habe dann eine Eigenschaft auf MyView namens color.

Was ich möchte, ist Interface Builder in der Lage sein, die color zu wählen und auch die Beschriftung mit der Schriftart anzuzeigen, die auf diese Farbe festgelegt ist.

In meinem Code ich habe ...

@IBDesignable class MyView: UIView { 

    private let textLabel = UILabel() 

    @IBInspectable var color: UIColor = .blackColor() { 
     didSet { 
      textLabel.textColor = color 
     } 
    } 

    required init(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 

     initialSetup() 
    } 

    override init(frame: CGRect) { 
     super.init(frame: frame) 

     initialSetup() 
    } 

    private func initialSetup() -> Void { 
     self.backgroundColor = .clearColor() 

     textLabel.textAlignment = .Center 
     textLabel.numberOfLines = 0 

     addSubview(textLabel) 
    } 

    override func layoutSubviews() { 
     super.layoutSubviews() 

     textLabel.frame = bounds 
    } 

    // I have no idea what I'm doing here?! 
    override func prepareForInterfaceBuilder() { 
     // should I create a label specifically for here? 
     // or should I use the property textLabel? 

     textLabel.text = "Hello, world!" // setting place holder IB text? 
     textLabel.textColor = color 
     textLabel.font = .systemFontOfSize(21) 
     textLabel.textAlignment = .Center 
     textLabel.numberOfLines = 0 

     // do I need to add sub view? 
    } 

} 

IBInspectable

In IB kann ich die Farbe Eigenschaft dort sehen, und ich kann es eingestellt. Ärgerlich nimmt es einen Standardwert von .clearColor(), aber nicht die Farbe, die ich im Code einstelle. Gibt es eine Möglichkeit, das zu beheben?

IBDesignable

Als ich den Blick in Interface legte es zeigt alle prüfbaren Eigenschaften, aber nichts ist in der aktuellen Ansicht gezeigt.

Wenn ich es laufe alles funktioniert gut. Ich möchte nur etwas in IB arbeiten lassen (außer drawRect). Ich finde jedoch einen deutlichen Mangel an Dokumentation.

Bearbeiten - Warnungen

Ich habe gerade bemerkt, dass ich bauen Fehler bekommen/Warnungen sagen ...

Warnung: IB Designables: für Schlüsselpfad benutzerdefinierte Laufzeit Attribut Ignorieren „Farbe "in der Instanz von" UIView ". Beim Versuch, den Wert zu setzen, wurde eine Ausnahme ausgelöst: [setValue: forUndefinedKey:]: Diese Klasse ist für die Schlüsselfarbe nicht Schlüsselcodierkonform.

Dies wird wahrscheinlich die Lösung :)

ändern

Antwort

2

Ich kopierte den Code aus Ihrer Frage aktualisieren in eine neue App, fügte die Ansicht hinzu und legte die Eigenschaft fest und es funktionierte gut.

Der angezeigte Fehler weist darauf hin, dass Sie die Ansicht im Identity Inspector irgendwann wieder in eine einfache UIView geändert haben (die benutzerdefinierten Attribute bleiben in diesem Fall erhalten).

enter image description here

+0

Nun, im Moment bekomme ich eine "Segmentation Fault: 11" beim Versuch zu laufen, also keine Ahnung was los ist. Das könnte der Grund dafür sein. Gut zu wissen, dass ich den richtigen Code richtig verstanden habe. Ich habe heute Xcode 4 (Gründe) installiert, also frage ich mich, ob diese Installation sich mit Compilern oder sowas herumgeschlagen hat ?! Trotzdem danke. Behalte mein Swift-Projekt: D – Fogmeister

+0

OMLG! Der seg-Fehler lag daran, dass ich '.clearColor()' in einem Attribut anstelle von 'UIColor.clearColor()' verwendet habe, aber im Code keine Fehler angezeigt wurden. Wie auch immer, alles funktioniert jetzt: D Danke! – Fogmeister

1

Wenn Farbe gesetzt Sie die Eigenschaft wie textlabel unter Verwendung eines didSet

@IBInspectable var color: UIColor = UIColor.blackColor() { 
    didSet { 
     textLabel.textColor = color 
    } 
} 
+0

Ich fügte hinzu, dass. Aber ich habe gerade bemerkt, dass ich auch Warnungen erhalte ... "Ignoriere das benutzerdefinierte Laufzeitattribut für keyPath color ..." Dies wurde in die Frage eingefügt. – Fogmeister

1

Ich verwende swift 2.0 und in meinem Fall wurde dynamische Eigenschaft fehlt.Schlusscode:

@IBInspectable dynamic var radius:CGFloat = 2.0 { 
    didSet { 
    // setNeedsDisplay() 
     layer.cornerRadius = radius 

    } 
} 

Finden Sie heraus, Fehler während Build für IB Designables: http://lamb-mei.com/537/xcode-ibdesignables-ignoring-user-defined-runtime-attribute-for-key-path-bordercolor-on-instance-of-uiview-this-class-is-not-key-value-coding-compliant-for-the-key-bordercolor/

Verwandte Themen