У меня есть окно с NSTextField (в Snow Leopard), которое я привязал к функции NSString в своем классе WindowController. Эта строка будет объединять информацию о выборе и количестве моего табличного представления, предоставленную моим контроллером массива. Он получает начальное значение "0 0"
, но никогда не обновляется при изменении выбора или количества. Привязка выглядит следующим образом (владелец файла — MyWindowController):
Я реализовал + (NSSet *)keyPathsForValuesAffecting<key>
(ниже), но привязка никогда не обновляется, даже когда изменяется общее количество и выбор контроллера массива.
(Выполнено дополнительное устранение неполадок) Первоначально я использовал привязку Display Pattern Value для NSTextField, но мне требовалась более сложная логика, чем та привязка, которую предоставляла эта привязка. Затем я начал прослушивать события изменения/изменения выбора в TableView, которые отображают содержимое контроллера массива и динамически изменяют привязки значения шаблона отображения, но это было похоже на хак и слишком сложно.
Я уверен, что есть что-то, что мне не хватает, но я не могу сказать, что. У кого-нибудь есть идеи? Я прочитал документацию Apple по наблюдению за ключом и значением, и это, кажется, все, что нужно. Я проверил, и мой keyPathsForValuesAffectingMyString
вызывается, но myString
вызывается только один раз. Я привел свой код ниже (обновлен x3).
Обновление от 21 января
Я все еще затыкаюсь, пытаясь понять это. Когда я addObserver
to 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
-arrayController
и запустите приложение. Первые несколько раз это вызывается, каково значениеarrayController?
- person Mike Abdullah   schedule 17.01.2011