В Cocoa Bindings программное изменение значения NSTextField не приводит к обновлению модели.

У меня есть 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];
}

person DrummerB    schedule 15.05.2012    source источник


Ответы (1)


Вы можете использовать target-action или Cocoa Bindings:

  1. Target-action: соедините селектор действия текстового поля с некоторым действием updateValue контроллера. Затем в текстовом поле вызовите селектор после изменения значения текстового поля. Действие должно получить значение текстового поля и передать его модели.

  2. Cocoa Bindings: Установите привязку значения текстового поля к KVO-совместимому свойству объекта модели. Затем вы можете обновить значение ячейки, и связующее устройство обновит объект модели для вас.

Преимущество этих конкретных схем заключается в том, что связь между текстовым полем и свойством модели обрабатывается либо привязкой, либо целью. Если вы хотите использовать текстовое поле для другого свойства, вы можете просто использовать другое действие или другую привязку, не изменяя код пользовательского текстового поля.

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


Действительно, вы сказали "связанный". Я думал, что программные изменения в текстовом поле вызвали обновление, но, поскольку это не так, вы можете обновить связанное значение самостоятельно. Вот код, который вы можете попробовать:

NSDictionary *bindingInfo = [self infoForBinding:NSValueBinding];
[[bindingInfo valueForKey:NSObservedObjectKey] setValue:self.integerValue
                                             forKeyPath:[bindingInfo valueForKey:NSObservedKeyPathKey]];
person paulmelnikow    schedule 15.05.2012
comment
Как я уже сказал, я использую привязки. Значение моего текстового поля привязано к KVO-совместимому свойству моего объекта модели. Моя проблема в том, что привязка обновляет свойство объекта модели только тогда, когда я изменяю значение текстового поля вручную, но не когда оно изменяется программно. - person DrummerB; 15.05.2012
comment
Моя ошибка: я думал, что программные обновления привязанных элементов управления обновляют модель. Я поищу код для публикации. - person paulmelnikow; 15.05.2012
comment
К сожалению, это не так. Спасибо за попытку помочь! - person DrummerB; 15.05.2012
comment
Большое спасибо, это помогло! Мне пришлось обернуть значение в объект NSNumber, но теперь это работает. Я обновил свой вопрос тем, что в итоге использовал. Я назначил награду за старый, тот же вопрос. Если вы ответите там, я могу присудить его вам. В противном случае я свяжусь с этим вопросом в качестве ответа. stackoverflow .com/questions/8310236/ - person DrummerB; 15.05.2012
comment
Спасибо! Я так и сделал. Кроме того, я вспомнил, что в Cocoa есть константы для имен привязок, и обновил свой код, чтобы отразить это. - person paulmelnikow; 15.05.2012