У меня есть NSDocument, который имеет следующую структуру:Как добавить объект к программно связанному NSMutableArray?
@interface MyDocument : NSDocument
{
NSMutableArray *myArray;
IBOutlet NSArrayController *myArrayController;
IBOutlet MyView *myView;
}
@end
Я создание экземпляр NSArrayController и MyView в MyDocument.xib, и сделал подключение к файлу владелице (MyDocument), поэтому я уверен, что с точки зрения Interface Builder, я все сделал правильно.
Интерфейс для MyView прост:
@interface MyView : NSView {
NSMutableArray *myViewArray;
}
@end
Теперь в MyDocument windowControllerDidLoadNib
, у меня есть следующий код:
- (void)windowControllerDidLoadNib:(NSWindowController *) aController
{
[super windowControllerDidLoadNib:aController];
[myArrayController setContent:myArray];
// (This is another way to do it) [myArrayController bind:@"contentArray" toObject:self withKeyPath:@"myArray" options:nil];
[myView bind:@"myViewArray" toObject:myArrayController withKeyPath:@"arrangedObjects" options:nil];
}
В отладчике, я проверил, что myViewArray
является NSControllerArrayProxy, так похоже, что моя программная привязка верна. Однако, когда я пытаюсь добавить объекты в методы MyView к MyView myViewArray
, они, похоже, не обновляют MyDocument myArray
. Я попробовал оба из следующих подходов:
[myViewArray addObject:value];
[self addMyViewArraysObject:value];
(Второй подход вызывает ошибку компиляции, как и ожидался, но я думал, что во время выполнения Objective-C будет «реализовывать» этот метод за мое ограниченное понимание КВО.)
Есть ли что-то не так с тем, как я пытаюсь обновить myViewArray
? Что-то не так с моей программной привязкой? (Я пытаюсь сделать это программно, поскольку MyView является настраиваемое представление, и я не хочу, чтобы создать палитру IB для него.)
По какой-то причине я думал, что контроллер массива имеет некоторую способность слушать изменения в самом массиве. Я, возможно, все это сделал совершенно неправильно, потому что (как я ответил на ваш комментарий к моему ответу), даже если я добавлю insertObject: inMyViewArrayAtIndex: в MyView и попытаюсь вставить NSValue в myViewArray в этом методе и вызвать этот метод из mouseUp :, он работает только в том случае, если я привязываю myViewArray к NSArrayController.content в MyDocument. Произошел сбой организованного прокси-сервера. – erikprice
«По какой-то причине я думал, что контроллер массива имеет некоторую способность слушать изменения в самом массиве». Это KVO. Контроллер массива добавляет себя в качестве наблюдателя для свойства bound-to; когда вы мутируете это свойство с помощью своих аксессуаров, KVO отправляет соответствующие уведомления, которые получает контроллер массива. –
Хорошо, хорошо, потому что я так и думал. Спасибо, что поняли это. Тем временем я все еще пытаюсь понять, как NSArrayController можно использовать с массивом элементов NSValue, если мы должны быть привязаны к builtObjects (который, кажется, не раскрывает сами элементы непосредственно). – erikprice