2015-01-22 13 views
8

Ho una sottoclasse di UIView chiamata MyView che sto creando.Utilizzo di IBDesignable e prepareForInterfaceBuilder con una UILabel

In esso c'è un UILabel (questo è aggiunto nel codice non in InterfaceBuilder per motivi).

Quindi ho una proprietà su MyView denominata color.

Quello che mi piacerebbe è che Interface Builder sia in grado di selezionare lo color e anche di visualizzare l'etichetta con il carattere impostato su quel colore.

Nel mio codice ho ...

@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 posso vedere la proprietà colore lì e posso impostarlo. Fastidiosamente ci vuole un valore predefinito di .clearColor() anche se non il colore che ho impostato nel codice. C'è un modo per risolvere questo?

IBDesignable

Quando metto la vista nel InterfaceBuilder mostra tutte le proprietà ispezionabili ma nulla è mostrata nella vista reale.

Quando lo eseguo tutto funziona correttamente. Mi piacerebbe essere in grado di ottenere qualcosa di lavoro (diverso da drawRect) in IB. Comunque sto trovando una netta mancanza di documentazione.

Modifica - Avvertenze

Ho appena notato che sto ricevendo costruire errori/avvisi dicendo ...

avvertimento: IB Designables: Ignorando attributo runtime definiti dall'utente per il percorso chiave "colore "su istanza di" UIView ". Colpire un'eccezione quando si tenta di impostare il suo valore: [setValue: forUndefinedKey:]: questa classe non è un valore chiave che codifica-compatibile per il colore chiave.

Questo probabilmente cambierà la soluzione :)

risposta

2

Ho copiato il codice dalla tua domanda in una nuova app, ha aggiunto la vista e impostato la proprietà e ha funzionato bene.

L'errore che stai vedendo suggerisce che a un certo punto hai cambiato la vista in un semplice UIView nella finestra di ispezione della identità (gli attributi definiti dall'utente rimangono in quel caso).

enter image description here

+0

Bene, al momento sto ricevendo un "errore di segmentazione: 11" quando provo a correre, quindi non ho idea di cosa sta succedendo. Questa potrebbe essere la causa di questo. Sono contento di sapere che ho avuto il codice vero, però. Ho installato Xcode 4 (ragioni) oggi, quindi mi chiedo se l'installazione non abbia funzionato con i compilatori o qualcosa del genere ?! Grazie comunque. Terrò il mio progetto Swift: D – Fogmeister

+0

OMLG! L'errore del segmento era perché usavo '.clearColor()' in un attributo invece di 'UIColor.clearColor()' ma non c'erano errori nel codice. Ad ogni modo, tutto funziona ora: D Grazie! – Fogmeister

1

Quando colore è impostato è necessario aggiornare la proprietà textLabel come qui di seguito utilizzando un didSet

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

ho aggiunto che. Ma ho appena notato che ricevo anche degli avvertimenti ... "Ignorando l'attributo di runtime definito dall'utente per il colore keyPath ..." Aggiunto questo nella domanda. – Fogmeister