Poniższy eksperyment stwierdza, że rodzimy nieruchomość tekst jest ustawiony przed własności kategorii, a więc wartość można bezpiecznie nadpisane kategorii seter.
A Kategoria label:
// UILabel+Thingy.h
#import <UIKit/UIKit.h>
@interface UILabel (Thingy)
@property (nonatomic, strong) IBInspectable NSString *thingy;
@end
// UILabel+UILabel_Thingy.m
#import "UILabel+Thingy.h"
#import <objc/runtime.h>
@implementation UILabel (Thingy)
- (NSString *)thingy {
return objc_getAssociatedObject(self, @selector(thingy));
}
- (void)setThingy:(NSString *)thingy {
NSLog(@"setting thingy to '%@', my text is currently '%@'", thingy, self.text);
objc_setAssociatedObject(self, @selector(thingy), thingy, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
@end
w IB, należy ustawić właściwość kategorii podlegającej inspekcji i właściwość tekstu ....
Trochę oprzyrządowania zawierającego kontroler widoku:
- (void)viewDidLoad {
[super viewDidLoad];
NSLog(@"didLoad text is '%@' and thingy is '%@'", self.label.text, self.label.thingy);
}
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
NSLog(@"willAppear text is '%@' and thingy is '%@'", self.label.text, self.label.thingy);
}
Uruchom, a wynik indeksu NSLog miej- scu, że podczas przebudzony ze stalówką, właściwość rodzimy jest ustawiony przez czas własność kategoria seter nazywa ...
... [794: 41622] ustawienie thingy „value” cienias, mój tekst jest obecnie 'wartość tekst'
... [794: 41622] tekst didload jest 'wartość tekst' i thingy jest 'wartość thingy'
... [794: 41622] tekst willappear jest 'wartość tekst' i jest "rzeczywista wartość"
Ustawianie właściwości tekstu etykiety w ca Narzędzie ustawiające właściwość tegory (i przetestuje ją) powoduje, że właściwość text jest nadpisywana do właściwości thingy, ponieważ właściwość text jest inicjowana jako pierwsza.
Dalsze dowody można zobaczyć w pliku XIB gdy renderowane jako XML ...
<label opaque="NO" (... all the native properties) text="text value" (...) id="XAM-6h-4fn">
<rect key="frame" x="274" y="147" width="278" height="34"/>
(... and so on)
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="string" keyPath="thingy" value="thingy value"/>
</userDefinedRuntimeAttributes>
</label>
... która jest zgodna z poglądem jest instancja i zainicjowany przez pre-order przechodzenie, a tym samym ustawianie właściwości etykiety (nadrzędny znacznik) przed tagiem (child tag) userDefinedRuntimeAttributes.
Czy możesz być bardziej jasne, jeśli tekst etykiety jest ustawiany programowo (jak w viewDidLoad) lub masz na myśli ustawić w IB? –
Niestety oba są ustawione przez IB – bencallis