it-swarm.com.de

Was ist der Schlüsselpfad in benutzerdefinierten Laufzeitattributen?

Ich habe ein Projekt geerbt und bin verwirrt darüber, was ein bestimmter Schlüssel ist. Meine Frage ist: Was ist der styleName key-Pfad? Ist es eine Eigenschaft für die Aussicht? Wie kann ich herausfinden, welche Schlüsselpfade verfügbar sind?

Nachdem ich beispielsweise ein UILabel aus dem Storyboard ausgewählt habe, überprüfe ich den Identitätsinspektor. In den benutzerdefinierten Laufzeitattributen wird Folgendes angezeigt:

enter image description here

Ich habe versucht, die Datei main-styles.plist zu öffnen, weiß jedoch nicht, wie sie miteinander verbunden ist. 

wenn ich auf den Attributinspektor klicke (während das UILabel weiterhin im Storyboard markiert bleibt), sieht es so aus:

enter image description here

12
j2emanue

Es gibt ein NSKeyValueCoding-Protokoll , dem viele Objekte in UIKit entsprechen.

Eine der Methoden in NSKeyValueCoding ist valueForKey: (und viele andere relevante Methoden, überprüfen Sie die Dokumentation, die ich verlinkt habe).

Durch den Aufruf von valueForKey: für ein Objekt können wir zur Laufzeit auf Eigenschaften zugreifen, die im Interface Builder festgelegt wurden.

Auf diesem Label könnte ich zum Beispiel Folgendes tun:

Ziel c:

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

Swift:

let style = myLabel.valueForKey("styleName")

Jetzt kann ich den durch den Interface Builder eingestellten Wert abrufen und zur Laufzeit kann ich etwas mit dem Label tun, basierend auf dem hier eingestellten Wert. Zum Beispiel könnte ich hier den bestimmten "Stilnamen" verwenden, um das Etikett auf eine bestimmte Weise zu gestalten.

Wenn Sie das Projekt nach valueForKey oder "styleName" durchsuchen, werden Sie wahrscheinlich herausfinden, wo diese Eigenschaft verwendet wird und was genau damit gemacht wird.


Zu meiner Frage bezüglich des Attributinspektors können Sie ab Xcode 6 die Eigenschaft @IBInspectable verwenden, um Eigenschaften zu erstellen, die im Attributinspektor angezeigt werden ( wie hier ). Betrachten Sie diese Erweiterung von UIView:

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

Wenn wir uns nun den Attribute-Inspector für eine UIView (oder Unterklasse) in unserem Storyboard ansehen, sehen wir Folgendes:

enter image description here

Wir haben jetzt eine Eigenschaft "Rahmenfarbe", die über den Attribut-Inspector verfügbar ist und normalerweise nicht vorhanden ist. Ich weise dieses Tool darauf hin, dass, wenn Sie eine dieser Eigenschaften über den Attribut-Inspector festlegen, der von Ihnen festgelegte Wert tatsächlich als eine dieser "benutzerdefinierten Laufzeitattribute" gespeichert wird:

enter image description here

Jedes Mal, wenn diese Ansicht von der XIB in meiner App geladen wird, wird als Erstes meine borderColor -Eigenschaft auf diese rote Farbe gesetzt, die ich im Interface Builder ausgewählt habe.

23
nhgrif

Nachfolgend finden Sie eine Liste der verfügbaren Attributtypen und des entsprechenden Eigenschaftstyps.

 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

Basierend auf dem Apple-Dokument

Verwenden Sie benutzerdefinierte Laufzeitattribute, um einen Anfangswert für Objekte festzulegen, für die kein Schnittstellenersteller-Inspektor vorhanden ist. Wenn Sie beispielsweise die folgenden Einträge im Identitätsinspektor für eine benutzerdefinierte Ansicht hinzufügen:

 The image of runtime attributes

Die benutzerdefinierte Ansicht erhält diese Meldung, wenn die Spitze geladen ist:

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

Wichtig: Der Eigenschafts- oder Schlüsselpfad für die benutzerdefinierte Laufzeit Attribut muss im Objekt vorhanden sein, andernfalls tritt eine Ausnahme auf.

Weil diese Methoden aufgerufen werden, wenn nib geladen wird. Diese Laufzeitattribute können also innerhalb von -(void)awakeFromNib abgerufen werden.

Zum Beispiel,

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

danke nhgrif. Eigentlich dank Ihrer Antwort, die großartig war, und ich fand heraus, was passiert. Sie haben eine globale Kategorie in UIView erstellt. es heißt UIView + Mystyle. Dort haben sie eine Methode mit folgender Signatur:

- (void) setStyleName:(NSString*) styleName

daher verwendet xcode diese Methode ohne 'set' und ordnet sie dem Laufzeitpfadattribut der Laufzeit zu. In dieser Methode wenden sie das Attribut an. 

0
j2emanue