2012-10-29 14 views
6

Mam klasę, którą chcę zastąpić setera, ale powiedziano mi, że dobrą praktyką jest nie modyfikować automatycznie wygenerowanego pliku klasy i tworzyć kategorie, aby zamiast tego je rozszerzyć (ponieważ jeśli zmienisz model i zregenerujesz plik, stracisz wszystkie swoje dodatki).Przesłaniam ustawianie właściwości w kategorii klasy

Jeśli wykonam metodę dla osoby ustawiającej w kategorii, to zdecydowanie uruchamia ona metodę (testowaną przy użyciu NSLog), ale nie wiem, jak przypisać rzeczywistą wartość właściwości. Normalnie bym syntetyzować bezpośrednio personelowi

@synthesize finished = _finished;

tak, że można uzyskać dostęp do właściwości w seter korzystając _finished, tak:

- (void)setFinished:(NSNumber *)finishedValue { 
    _finished = finishedValue; 
    self.end_time = [NSDate date]; 
} 

ale w którym nieruchomość jest zdefiniowany w NSManagedObject to nie wydaje się możliwe.

+0

Dlaczego isn to jest możliwe? – trojanfoe

+0

Otrzymujesz komunikat o błędzie z informacją, że nie można zsyntetyzować w kategorii – Dan2552

+0

Nie odpowiada to na pytanie, ale przenosi Cię tam, gdzie zmierzasz w inny sposób: http://compileyouidontevenknowyou.blogspot.com/2012/06/adding -properties-to-class-you-dont.html –

Odpowiedz

6

Można zrobić z podklasy zobaczyć doc here

- (void)setName:(NSString *)newName 
{ 
    [self willChangeValueForKey:@"name"]; 
    [self setPrimitiveName:newName]; 
    [self didChangeValueForKey:@"name"]; 
} 
+4

Używając '[self setPrimitiveValue: finished forKey : @ "finished"] "wydaje się działać w tej kategorii, tego właśnie szukałem, dzięki za prowadzenie mnie we właściwym kierunku – Dan2552

+1

Link do dokumentów powyżej jest zepsuty. Czy ktoś może to naprawić? – ishahak

1

W kategorii nie można dodawać wartości właściwości, tylko metody. Musisz więc subClass, aby wykonać to, co chcesz.

+0

możesz, http://stackoverflow.com/questions/8733104/objective-c-property-instance-variable-in-category – someUser

0

Jest to prosty sposób, aby to zrobić, wykonaj następujące czynności:

Model.h

@interface Model 
@property(nonatomic,copy) NSString * string; 
@end 

produkcyjna + Zastąp .m

@interface Model() 
{ 
    NSString *_string; 
} 
@end 

@implementation Model (Override) 
- (void)setString:(NSString *)string 
{ 
    return _string = string; 
}  
@end 
Powiązane problemy