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:
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:
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:
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":
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.
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:
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;
}
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.