У меня есть NSTextField, привязанный к моей модели. Если я изменяю содержимое текстового поля программно, модель не обновляется. Я знаю, что вы должны вместо этого обновите модель.
Но я пытаюсь реализовать подкласс NSTextField, который распознает прокрутку, когда мышь наводит на нее курсор, чтобы изменить ее числовое значение. Очевидно, у меня нет доступа к модели из этого подкласса. Итак, у вас есть какие-либо предложения, как я могу это сделать?
РЕШЕНИЕ (спасибо noa):
- (void)scrollWheel:(NSEvent *)theEvent {
[self setFloatValue:[self floatValue] - [theEvent deltaY]];
NSDictionary *bindingInfo = [self infoForBinding: NSValueBinding];
NSObject *boundObject = [bindingInfo valueForKey:NSObservedObjectKey];
NSString *keyPath = [bindingInfo valueForKey:NSObservedKeyPathKey];
[boundObject setValue:[NSNumber numberWithFloat:[self floatValue]]
forKeyPath:keyPath];
}
Ответ 1 · рейтинг 6 · paulmelnikow
Вы можете использовать target-action или Cocoa Bindings:
Target-action: соедините селектор действия текстового поля с некоторым действием updateValue контроллера. Затем в текстовом поле вызовите селектор после изменения значения текстового поля. Действие должно получить значение текстового поля и передать его модели.
Cocoa Bindings: Установите привязку значения текстового поля к KVO-совместимому свойству объекта модели. Затем вы можете обновить значение ячейки, и связующее устройство обновит объект модели для вас.
Преимущество этих конкретных схем заключается в том, что связь между текстовым полем и свойством модели обрабатывается либо привязкой, либо целью. Если вы хотите использовать текстовое поле для другого свойства, вы можете просто использовать другое действие или другую привязку, не изменяя код пользовательского текстового поля.
Я бы, вероятно, использовал привязки, которые я считаю менее трудоемкими, но целевое действие тоже прекрасно подходит и немного более прямолинейно.
Действительно, вы сказали "связанный". Я думал, что программные изменения в текстовом поле вызвали обновление, но, поскольку это не так, вы можете обновить связанное значение самостоятельно. Вот код, который вы можете попробовать:
NSDictionary *bindingInfo = [self infoForBinding:NSValueBinding];
[[bindingInfo valueForKey:NSObservedObjectKey] setValue:self.integerValue
forKeyPath:[bindingInfo valueForKey:NSObservedKeyPathKey]];