2012-10-29 7 views
6

Ho una classe NSManagedObject a cui voglio sovrascrivere un setter, ma mi è stato detto che è buona norma non modificare il file di classe generato automaticamente e creare categorie per estenderle (perché se si modifica il modello e si rigenera il file, si perdono tutte le aggiunte).Overriding property setter in una classe di classe

Se faccio un metodo per il setter in una categoria, esegue sicuramente il metodo (testato con NSLog), ma non so come assegnare il valore della proprietà reale. Normalmente, mi piacerebbe sintetizzare la struttura utilizzando

@synthesize finished = _finished;

modo che io possa accedere alla proprietà nella setter utilizzando _finished, in questo modo:

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

ma dove la proprietà è definita nel NSManagedObject questo non sembra possibile.

+0

Perché isn ' è possibile? – trojanfoe

+0

Si ottiene un errore che dice che non è possibile sintetizzare in una categoria – Dan2552

+0

Questo non risponde alla domanda, ma ti porta dove stai andando in un modo diverso: http://compileyouidontevenknowyou.blogspot.com/2012/06/adding -properties-to-class-you-dont.html –

risposta

6

Si può fare con la creazione di sottoclassi vedere il doc here

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

utilizzando '[self setPrimitiveValue: finished forKey : @ "finished"] 'sembra funzionare nella categoria, questo è quello che stavo cercando, grazie per avermi guidato nella giusta direzione – Dan2552

+1

Link ai documenti sopra è rotto. Qualcuno può aggiustarlo per favore? – ishahak

1

In una categoria, non è possibile aggiungere valore di proprietà, solo metodi. Quindi avrai bisogno di sottoclassare per eseguire ciò che vuoi.

+0

è possibile, http://stackoverflow.com/questions/8733104/objective-c-property-instance-variable-in-category – someUser

0

C'è un modo semplice per farlo, provare quanto segue:

Model.h

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

Modello + Override .m

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

@implementation Model (Override) 
- (void)setString:(NSString *)string 
{ 
    return _string = string; 
}  
@end 
Problemi correlati