Поток КВО для привязок не является ортогональным; привязка - это не свойство , это ссылка на свойство. Это краткое описание того, как работают привязки:
- KVO используется для передачи изменений от модели к контроллеру и представлению.
- KVC используется для передачи изменений от вида к контроллеру и модели.
Таким образом, когда представление с привязками обрабатывает события, оно должно распространять изменения свойств, на которые ссылаются его привязки.
Вот как может выглядеть ваш код с помощью вспомогательного метода для тяжелой работы по распространению изменений через привязки:
- (void)magnifyWithEvent:(NSEvent *)event
{
if ([event magnification] > 0) {
if ([self zoomValue] < 1) {
[self setZoomValue: [self zoomValue] + [event magnification]];
}
}
else if ([event magnification] < 0) {
if ([self zoomValue] + [event magnification] > 0.1) {
[self setZoomValue: [self zoomValue] + [event magnification]];
}
else {
[self setZoomValue: 0.1];
}
}
// Update whatever is bound to our zoom value.
[self updateValue:[NSNumber numberWithFloat:[self zoomValue]]
forBinding:@"zoomValue"];
}
Немного прискорбно, что ImageKit требует использования @"zoomValue"
для ссылки на привязку Zoom Value IKImageBrowserView, большинство привязок в AppKit имеют собственную глобальную строковую константу, например NSContentBinding
.
И вот этот универсальный служебный метод для распространения изменений через привязку:
- (void)updateValue:(id)value forBinding:(NSString *)binding
{
NSDictionary *bindingInfo = [self infoForBinding:binding];
if (bindingInfo) {
NSObject *object = [bindingInfo objectForKey:NSObservedObjectKey];
NSString *keyPath = [bindingInfo objectForKey:NSObservedKeyPathKey];
NSDictionary *options = [bindingInfo objectForKey:NSOptionsKey];
// Use options to apply value transformer, placeholder, etc. to value
id transformedValue = value; // exercise for the reader
// Tell the model or controller object the new value
[object setValue:transformedValue forKeyPath:keyPath];
}
}
Фактическое применение заполнителей, преобразователей значений и т. П. Оставлено в качестве упражнения для читателя.