Как обновить NSTextField, когда его форматер меняет свой формат?

У меня есть пара NSTextFields, которые используют привязки для получения своих значений. К каждому текстовому полю прикреплен пользовательский NSFormatter, который используется для форматирования значения.

Теперь я хочу изменить формат этого NSFormatter, я делаю это, устанавливая ключ в NSUserDefaults. Форматировщик прослушивает NSUserDefaultsDidChangeNotification. Это работает до тех пор, пока изменяется значение, поддерживающее привязку. Если это значение не изменяется, NSTextField не обновляется.

Как правильно обновить NSTextField, если его форматер изменил свой формат?

В лучшем случае мне не нужны ни ссылки на NSTextField, ни на NSFormatter. Во всем приложении есть различные температурные метки, которые должны все менять свой формат. Я хотел бы иметь возможность начать "обновление привязок" из NSFormatter. Может быть, я пропускаю NSNotification?

Я пытался отправить willChangeValueForKey: а также didChangeValueForKey: КВО уведомления, но это не сработало.
Прямо сейчас я использую довольно хакерский способ, я просто немного меняю значение.

- (IBAction)temperatureMenuDidSelect:(NSMenuItem *)sender {
    [[NSUserDefaults standardUserDefaults] setInteger:sender.tag forKey:MBUserDefaultsTemperatureSystemKey];
    // refresh. this is an ugly hack, maybe there is a nicer way?
    self.selectedDevice.temperature += 0.000001;
//    [self.selectedDevice willChangeValueForKey:@"temperature"];
//    [self.selectedDevice didChangeValueForKey:@"temperature"];
}

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

2 ответа

Ты пытался:

self.selectedDevice.temperature = self.selectedDevice.temperature;

Это может быть вопрос о том, что здесь связано с чем. Ваш NSTextField связан траекторией ключей selectedDevice.temperature? может быть, вам нужно использовать @"selectedDevice.temperature" для ключевого параметра.

У меня никогда не было проблем с использованием willChangeValueForKey: с последующим didChangeValueForKey: Я думаю, возможно, проблема в том, что вы должны использовать @"_temperature" за ключ вместо @"temperature",

С другой стороны, я никогда не пытался вызывать эти методы для объекта, кроме self, Вы пытались реализовать метод обновления внутри selectedDevice делать уведомления КВО? Я не знаю, почему это будет иметь значение, но у меня никогда не было проблем с обновлением значений

В вашем xib внутри инспектора просто проверьте, проверяет ли опция немедленно и постоянно обновляет.

Другие вопросы по тегам