web-dev-qa-db-fra.com

Quel est le chemin clé dans les attributs d'exécution définis par l'utilisateur?

J'ai hérité d'un projet et je suis confus sur ce qu'est une certaine clé. Ma question est la suivante: quel est le chemin styleName key? est-ce une propriété à la vue? Comment puis-je savoir quels chemins clés sont disponibles?

Par exemple, après avoir sélectionné un UILabel dans le storyboard, je vérifie l'inspecteur d'identité et, dans les attributs d'exécution définis par l'utilisateur, les éléments suivants:

enter image description here

J'ai essayé d'ouvrir le fichier main-styles.plist mais je ne sais pas comment il est lié. 

quand je clique sur l'inspecteur d'attributs (tout en gardant UILabel dans le storyboard en surbrillance), voici à quoi ça ressemble:

enter image description here

12
j2emanue

Il existe un protocole NSKeyValueCoding auquel de nombreux objets de UIKit se conforment.

Une des méthodes dans NSKeyValueCoding est valueForKey: (et de nombreuses autres méthodes pertinentes, consultez la documentation que j'ai liée).

En appelant valueForKey: sur un objet, nous pouvons, au moment de l'exécution, accéder aux propriétés définies dans le générateur d'interface.

Ainsi, par exemple, sur cette étiquette, je pourrais faire quelque chose comme ceci:

Objectif c:

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

Rapide:

let style = myLabel.valueForKey("styleName")

Maintenant, je peux récupérer la valeur définie via Interface Builder et au moment de l'exécution, je peux faire quelque chose avec l'étiquette en fonction de la valeur définie ici. Par exemple, ici, je pourrais utiliser le "nom de style" particulier pour concevoir l'étiquette de manière particulière.

Si vous recherchez dans le projet valueForKey ou "styleName", vous trouverez probablement où cette propriété est utilisée et ce qui est fait exactement avec elle.


Pour faire suite à ma question concernant l'inspecteur d'attributs, à partir de Xcode 6, nous pouvons utiliser la propriété @IBInspectable pour créer des propriétés qui apparaîtront dans l'inspecteur d'attributs ( comme vu ici ). Considérez cette extension UIView:

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

Maintenant, si nous examinons l'inspecteur d'attributs pour toute UIView (ou sous-classe) de notre storyboard, nous verrons ceci:

enter image description here

Nous avons maintenant une propriété "Couleur de bordure" disponible via l'inspecteur d'attributs qui n'y est généralement pas. La raison pour laquelle je signale cet outil est que chaque fois que vous définissez l'une de ces propriétés via l'inspecteur d'attributs, la valeur que vous définissez est réellement stockée sous l'un des "attributs définis par l'utilisateur":

enter image description here

Et chaque fois que cette vue est chargée à partir du XIB dans mon application, l'une des premières choses qui va se passer est que ma propriété borderColor sera définie sur cette couleur rouge que j'ai sélectionnée dans Interface Builder.

23
nhgrif

Vous trouverez ci-dessous une liste des types d'attributs disponibles et du type de propriété correspondant.

 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

4
Amit Jagesha シ

Basé sur le doc Apple

Utilisez les attributs d'exécution définis par l'utilisateur pour définir une valeur initiale pour les objets dépourvus d'inspecteur de générateur d'interface. Par exemple, si vous ajoutez les entrées suivantes dans l'inspecteur d'identité pour une vue personnalisée:

 The image of runtime attributes

La vue personnalisée recevra ce message lorsque le nib sera chargé:

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

Important: chemin de propriété ou de clé pour le runtime défini par l'utilisateur attribut doit exister dans l'objet, sinon une exception se produira.

Parce que ces méthodes sont appelées lorsque la nib est chargée. Ainsi, ces attributs d'exécution peuvent être obtenus dans la -(void)awakeFromNib.

Par exemple,

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

merci nhgrif. En fait, grâce à votre réponse qui était géniale, j'ai trouvé ce qui se passait. Ils ont créé une catégorie globale sur UIView. ça s'appelle UIView + mystyle. là ils ont une méthode avec la signature suivante:

- (void) setStyleName:(NSString*) styleName

so xcode utilise cette méthode sans 'set' et la met en correspondance avec l'attribut du chemin d'accès à la clé au moment de l'exécution. dans cette méthode, ils appliquent l'attribut. 

0
j2emanue