Вы можете привязать метод экземпляра получателя к значению поля, только если вы реализуете соответствующий метод установщика для привязки, чтобы попытаться записать изменения в значении .(Для некоторых других типов привязки установщик не требуется)
Допустимо, что установщик пуст.
Например, это используется для отображения количества новых элементов в поддереве экземпляра:
- (NSNumber*) numberOfNewItems
{
NSUInteger total = 0;
for (childItem* ci in self.items)
total += (ci.isNewValue) ? ci.items.count : 0;
return @(total);
}
// Does nothing but allows binding to above to be recalculated
- (void) setNumberOfNewItems:(NSNumber*)number { }
Это делает двусторонние привязки счастливыми.Если у вас не было установщика, вы получите ошибки, связанные с тем, что ключевой путь не соответствует KVC.(Если вы не привязываетесь к чему-то одностороннему, например, к «заголовку» или «подсказке» - для них не нужны установщики. Но установщик пригодится для пересчета названий и подсказок через геттер)
Обратите внимание, что внутри childItems вы можете просто сделать это:
self.isNewValue = NO;
[self.parent setNumberOfNewItems:nil]; // Trigers KVO for binding (does nothing else)
... что намного проще, чем попытаться зарегистрировать родительский регистр в качестве наблюдателя KVO для всех детей.
И если вы хотите, чтобы другие свойства в экземпляре повторно запускали геттер, вы можете добавить этот метод класса:
+ (NSSet *)keyPathsForValuesAffectingNumberOfNewItems {
return [NSSet setWithObjects:@"items", @"somethingElse", nil];
}