2011-01-13 5 views
4

Я, наверное, просто немного ленив здесь, но неся со мной. Вот моя ситуация. У меня есть класс с двумя неатомичными, сохраненными свойствами. Скажем:Можно ли настроить свойства @synthesized?

@property (nonatomic, retain) UITextField *dateField; 
@property (nonatomic, retain) NSDate *date; 

Я синтезирую их, как ожидалось, в реализации. Я хочу сказать, что всякий раз, когда вызывается установщик в дате, он также делает что-то с датойField (т. Е. Устанавливает свойство text на dateField, чтобы быть красиво отформатированной версией даты).

Я понимаю, что можно просто вручную переопределить Присваиватель даты в моей реализации, выполнив следующие действия:

- (void) setDate:(NSDate *)newDate { 
    if (date != newDate) { 
     [date release]; 
     date = [newDate retain]; 
     // my code to touch the dateField goes here 
    } 
} 

Что было бы удивительным, если я мог позволить Objective C обрабатывать цикл удержания/выпуска, но по-прежнему быть в состоянии «зарегистрировать» (из-за отсутствия лучшего термина) пользовательский обработчик, который будет вызываться после того, как произойдет сохранение/освобождение/набор. Я предполагаю, что это невозможно. Мой google-fu не придумал никакого ответа на этот вопрос, поэтому я подумал, что попрошу.

ответ

4

KVO (наблюдение за ключом/значением) может сделать это, вроде бы, но это будет еще больше кода и, вероятно, не будет легче читать или писать.

Вы можете быть знакомы с КВО, но в случае, если вы (или другие) не являются: В вашей init функции, вы могли бы сделать это:

[self addObserver:self forKeyPath:@"date" options:0 context:NULL]; 

Тогда вы бы осуществить это:

-(void)observeValueForKeyPath:(NSString*)keyPath 
        ofObject:(id)object 
         change:(NSDictionary*)change 
         context:(void*)context 
{ 
    if (object == self && [keyPath isEqualToString:@"date"]) { 
     // code to touch the dateField goes here 
    } 
} 

Наконец, в dealloc, вы могли бы сделать это:

[self removeObserver:self forKeyPath:@"date"]; 

Как вы можете видеть, это еще больше кода и сложнее понять. Не очень эффективен для кого-то, чья цель должна быть ленивой :-) Но KVO - это основная функция привязки данных Objective-C. Существуют некоторые платформы (например, Flex), которые могут выполнять привязку данных со значительно меньшим количеством кода, но в Objective-C требуется большая работа.

Кстати, не большое дело, но пример кода вы показали глючит - это должно выглядеть примерно так:

- (void) setDate:(NSDate *)newDate { 
    if (date != newDate) { 
     [date release]; 
     date = [newDate retain]; 
     // my code to touch the dateField goes here 
    } 
} 
+0

правой, так связан вопрос о том, где можно было найти один пример кода для того, что @synthesize делает в различных ситуациях (сохранить , присваивать, атомный и т. д.) –

+0

Прохладный, спасибо за ответ. Я знаю о KVO в теории, но здорово получить пример. Спасибо, что указали на ошибку в коде установщика. Я написал это без фактического использования (очевидно). Я отредактирую свой вопрос, чтобы он не вводил в заблуждение других. –

+0

Я должен быть слепым ... Что вы исправили в коде? О .. Вопрос, должно быть, был отредактирован. – Schultz9999

0

вы можете достичь путем создания частных Ивар/недвижимость (ок вы должны задокументировать собственность является частной, в идеале, используя очевидное имя) с другим именем:

@property (nonatomic, retain) UITextField *dateField; 
@property (nonatomic, retain) NSDate *date; // interface only 
@property (nonatomic, retain) NSDate *datePRIVATE; // the real ivar. 
... 
@synthesize datePRIVATE; 
- (void)setDate:(NSDate *)newDate { 
    self.datePRIVATE = newDate; 
    [self.dateField updateDisplayedDate:self.datePRIVATE]; 
} 
Смежные вопросы