У меня есть окно с NSTextField (в Snow Leopard), которое я связал с функцией NSString в моем классе WindowController. Эта строка будет объединять информацию о выборе и количестве моего табличного представления, предоставленную моим контроллером массива. Он получает начальное значение "0 0"
, но никогда не обновляется, когда изменяется выбор или число. Привязка выглядит следующим образом (владельцем файла является MyWindowController):
Я реализовал + (NSSet *)keyPathsForValuesAffecting<key>
(ниже), но привязка никогда не обновляется, даже когда изменяется общее количество и выбор контроллера массива.
( Выполнено дополнительное устранение неполадок ) Изначально я использовал привязку Display Pattern Value для NSTextField, но мне требовалась более сложная логика, чем та, которая предоставлялась. Затем я начал прослушивать события изменения / изменения выбора в TableView, который отображает содержимое контроллера массива и динамически изменяет привязки значений шаблона отображения, но это выглядит как хак и слишком сложный.
Я уверен, что что-то мне не хватает, но я не могу сказать, что. У кого-нибудь есть какие-либо идеи? Я прочитал документацию Apple по наблюдению за значением ключа, и это все, что нужно. Я проверил, и мой keyPathsForValuesAffectingMyString
вызывают, но myString
вызывают только один раз. Ниже приведен мой код ( обновлено x3 ).
Обновление 1/21
Я все еще пытаюсь понять это. Когда я addObserver
до self
для путей ключа arrayController, уведомления запускаются, как и ожидалось, поэтому мои пути ключей и механизм наблюдения значения ключа в порядке. Когда я вызываю [self didChangeValueForKey:@"myString"];
в моем методе observeValueForKeyPath
для тех же ключей, привязка все равно не обновляется, что наводит меня на мысль, что это проблема привязок, а не проблема KVO. Я собираюсь читать о механизме привязок подробнее ...
@interface MyWindowController : NSWindowController {
IBOutlet NSArrayController *arrayController;
}
- (NSArrayController *)arrayController;
- (NSString *)myString;
@end
@implementation MyWindowController
+ (NSSet *)keyPathsForValuesAffectingMyString {
return [NSSet setWithObjects:
@"arrayController.arrangedObjects",
@"arrayController.selection",
nil];
}
- (NSArrayController *)arrayController {
return arrayController;
}
- (NSString *)myString {
// Just as an example; I have more complicated logic going on in my real code
return [NSString stringWithFormat:@"%@, %@",
[arrayController valueForKeyPath:@"arrangedObjects.@count"],
[arrayController valueForKeyPath:@"selection.@count"]];
}
@end