2015-05-06 6 views
11

Ho ereditato un progetto e sono confuso su quale sia una determinata chiave. La mia domanda è, qual è il styleName Percorso chiave? è una proprietà alla vista? Come posso scoprire quali sono i percorsi chiave disponibili?Qual è il percorso chiave negli attributi di runtime definiti dall'utente?

Ad esempio, dopo seleziono un UILabel dallo storyboard I Controllare l'ispettore identità e nel runtime definito dall'utente attributi compaiono i seguenti:

enter image description here

ho cercato di aprire le principali stili. file plist ma non sicuro di come è collegato.

quando clicco su l'ispettore attributi (pur mantenendo l'UILabel nello storyboard evidenziato) questo è ciò che sembra:

enter image description here

+0

Se si fa clic su "Attitributes Ispezionare" (appena a destra del "Ispettore Identità"), c'è un campo "styleName"? – nhgrif

+0

Ok. Sto scrivendo una risposta. – nhgrif

risposta

22

C'è un NSKeyValueCoding protocol, che molti degli oggetti all'interno UIKit conforme alle.

Uno dei metodi all'interno di NSKeyValueCoding è valueForKey: (e molti altri metodi pertinenti, controllare la documentazione che ho collegato).

Chiamando valueForKey: su un oggetto, è possibile, in fase di esecuzione, accedere alle proprietà impostate sul generatore di interfacce.

Così, ad esempio, su questa etichetta, potrei fare qualcosa di simile:

Objective-C:

NSString *style = [myLabel valueForKey:@"styleName"]; 

Swift:

let style = myLabel.valueForKey("styleName") 

Ora può prendere il valore impostato tramite Interface Builder e in fase di esecuzione, posso fare qualcosa con l'etichetta in base a quale valore wa è impostato qui. Per esempio, qui, potrei usare il particolare "nome di stile" per progettare l'etichetta in un modo particolare.

Se si ricerca il progetto per valueForKey o "styleName", è probabile che si verifichi dove viene utilizzata questa proprietà e cosa si sta facendo esattamente con esso.


di follow-up per la mia domanda per quanto riguarda l'attributo ispettore, come di Xcode 6, siamo in grado di utilizzare la proprietà @IBInspectable per creare le proprietà che appariranno nella finestra di ispezione Attributi (as seen here). Considerate questo UIView estensione:

extension UIView { 
    @IBInspectable var borderColor : UIColor? { 
     set (newValue) { 
      self.layer.borderColor = (newValue ?? UIColor.clearColor()).CGColor 
     } 
     get { 
      return UIColor(CGColor: self.layer.borderColor) 
     } 
    } 
} 

Ora, se diamo uno sguardo alla Attributi per qualsiasi UIView (o sottoclasse) nel nostro storyboard, vedremo questo:

enter image description here

Ora avere una proprietà "Colore bordo" disponibile tramite l'ispettore Attributi che non è ordinariamente lì.La ragione per cui faccio notare questo strumento è perché ogni volta che si imposta una di queste proprietà tramite l'ispettore attributi, il valore impostato viene effettivamente memorizzata come uno di questi "Runtime definito dall'utente Attributi":

enter image description here

E ogni volta questa vista è caricata da XIB nella mia app, una delle prime cose che accadrà è che la mia proprietà borderColor sarà impostata su questo colore rosso che ho selezionato in Interface Builder.

0

grazie nhgrif. In realtà grazie alla tua risposta che è stata fantastica così più uno ho trovato che cosa sta succedendo. Hanno creato una categoria globale su UIView. è chiamato UIView + mystyle. lì hanno un metodo con la seguente firma:

- (void) setStyleName:(NSString*) styleName 

così Xcode utilizza questo metodo senza il 'set' e lo confronta con l'attributo percorso della chiave runtime. in questo metodo stanno applicando l'attributo.

2

Basato sul runtime definito Apple doc

Usa attributi utente di impostare un valore iniziale per gli oggetti che non dispongono di un ispettore costruttore di interfaccia. Ad esempio, se si aggiungono le seguenti voci nella finestra di ispezione di identità per una visualizzazione personalizzata:

The image of runtime attributes

La visualizzazione personalizzata otterrà questo messaggio quando il pennino è caricato:

[customView setValue:[NSNumber numberWithBoolean:NO] forKeyPath:@"isDataLoaded"]; 
[customView setValue:@"Hatha" forKeyPath:@"excersize.yoga"]; 
[customView setValue:nil forKeyPath:@"myData"]; 

Importante: la proprietà o il percorso chiave per l'attributo runtime definito attributo deve esistere nell'oggetto altrimenti si verificherà un'eccezione.

Perché questi metodi vengono chiamati quando viene caricato il nib. Quindi, tali attributi di runtime possono essere ottenuti all'interno dello -(void)awakeFromNib.

Ad esempio,

- (void)awakeFromNib 
{ 
// @property (nonatomic) BOOL isDataLoaded, which is assigned by the above `User Defined Runtime Attributes` picture. 
    BOOL isLoaded = self.isDataLoaded; 
} 
4

Ecco un elenco dei tipi di attributo disponibili e il tipo di proprietà corrispondente.

Boolean – BOOL (true/false) 
Number – NSNumber * or any numeric scalar, e.g. NSInteger 
String – NSString 
Point – CGPoint 
Size – CGSize 
Rect – CGRect 
Range – NSRange 
Color – UIColor 

Here Image Show How Can You Define User Defined Runtime Attributes

Problemi correlati