Как обновить NSTableVIew при заполнении связанного с ним NSMutableArray (привязки)

Я пытался привязать свой NSArraycontroller к NSMutableArray; массив содержит объекты типа «iData» (это настраиваемый класс). Класс также содержит несколько NSMutableString переменных, которые задаются как ключи для KVC. Затем я привязал свой NSTableColumn к NSArrayController и установил ключевые пути модели для каждого столбца соответственно.

Когда я пытаюсь заполнить массив, графический интерфейс ничего не показывает. Что я забыл?


person Omayr    schedule 29.10.2010    source источник
comment
как вы заполняете свой массив? . Если вы заполняете массив НЕ через arrayController, вы не получите автоматического обновления.   -  person Warren Burton    schedule 29.10.2010
comment
Я заполняю массив через NSMutableArray, но я не уверен, как я могу заполнить массив через NSArrayController, поскольку у меня нет экземпляра в моем классе Controller.m. Подскажите, пожалуйста, как я могу решить эту проблему.   -  person Omayr    schedule 29.10.2010
comment
Я перетащил экземпляр NSController в лоток mainmenu.nib. Нужно ли мне объявить IBOutLet NSArrayController в моем файле Controller.h, а затем подключить его к экземпляру NSArrayController в лотке?   -  person Omayr    schedule 29.10.2010


Ответы (2)


Так что вполне вероятно, что вы уже давно это решили, но если кто-то еще наткнется на этот вопрос ...

Я заполняю массив через NSMutableArray, но я не уверен, как я могу заполнить массив через NSArrayController, поскольку у меня нет экземпляра в моем классе Controller.m. Подскажите, пожалуйста, как я могу решить эту проблему.

Возможно, вы делали что-то вроде

[myData addObject:someObject];

Однако ваш NSArrayController не узнает об этом изменении экземпляра NSMutableArray, потому что addObject не соответствует требованиям KVC. Вам необходимо сообщить любому наблюдающему объекту, что ваш экземпляр NSMutableArray изменился. Есть как минимум два способа сделать это. Предполагая, что ваше свойство экземпляра NSMutableArray называется "myData", вы можете сделать что-то вроде следующего:

[self.willChangeValueForKey:@"myData"];
[myData addObject:someObject];
[self.didChangeValueForKey:@"myData"];

or

NSMutableArray *bindingsCompliantArray = [self mutableArrayValueForKey:@"myData"];
[bindingsCompliantArray addObject:someObject];

Другой ответ SO (ссылка) содержит хорошее объяснение того, что на самом деле делает mutableArrayValueForKey, но я рекомендую прочитать документацию разработчика Apple по кодированию ключ-значение и наблюдению за ключом, чтобы понять это.

Я перетащил экземпляр NSController в лоток mainmenu.nib. Нужно ли мне объявить IBOutLet NSArrayController в моем файле Controller.h, а затем подключить его к экземпляру NSArrayController в лотке?

Вам нужен NSArrayController экземпляр в вашем файле пера, но вам не нужен IBOutlet в вашем интерфейсе для ситуации, которую вы здесь описали. NSArrayController должен быть привязан к ключу вашего NSMutableArray (myData в моем примере), и похоже, что столбцы вашей таблицы уже привязаны правильно.

person Stephen Booher    schedule 21.04.2011
comment
Из 2 предложенных способов у меня работает только первый. Моему appDelegate принадлежит объект-контейнер A, который владеет (сильным) NSMutableArray элементов B. В моем .xib contentArray NSArrayCntroller привязан к A.B. Теперь я добавил к A другое свойство C и назначил C = [self mutableArrayValueForKey: @B]; Теперь я меняю путь привязки в xib на A.C, и ничего не работает. изменения в C не влияют на пользовательский интерфейс. В отладчике я проверил, что у B и C есть элементы, и если я вручную вызвал свои ArrayControllers correrangeObjects, он их представляет, поэтому привязки, вероятно, нарушены - person Motti Shneor; 05.07.2021

Хотя ответ Стивена, вероятно, будет правильным, я думаю, что исходный вопрос OP Как мне вставить / удалить / управлять мой NSMutableArray, использующий NSArrayController, заслуживает более простого и прямого ответа:

NSArrayController предоставляет полный и богатый набор методов и даже IBActions для выполнения практически всего, что вы хотите на управляемом NSMutableArray, со всеми тонкостями обработки вещей с помощью фильтров, путем выбора и сохранения правил сортировки, например. вставьте новый элемент, чтобы он был вставлен в соответствии с текущими описаниями сортировки.

Вот отрывок из этих методов (откройте NSArrayController.h для полного набора) и помните, что «контент» - это ваш NSMutableArray, а «ArradedObjects» - это массив, предоставляемый NSArrayController, который применяет фильтрацию и сортировку к контенту на его пути к отобразить в NSTableView.

- (BOOL)addSelectedObjects:(NSArray *)objects;
- (BOOL)removeSelectedObjects:(NSArray *)objects;

- (IBAction)add:(nullable id)sender;    // overridden to add a new object to the content objects and to the arranged objects
- (IBAction)remove:(nullable id)sender;    // overridden to remove the selected objects
- (IBAction)insert:(nullable id)sender;

- (void)addObject:(id)object;    // overridden to add to the content objects and to the arranged objects if all filters currently applied are matched
- (void)addObjects:(NSArray *)objects;
- (void)insertObject:(id)object atArrangedObjectIndex:(NSUInteger)index;    // inserts into the content objects and the arranged objects (as specified by index in the arranged objects) - will raise an exception if the object does not match all filters currently applied
- (void)insertObjects:(NSArray *)objects atArrangedObjectIndexes:(NSIndexSet *)indexes;
- (void)removeObjectAtArrangedObjectIndex:(NSUInteger)index;    // removes from the content objects and the arranged objects (as specified by index in the arranged objects)
- (void)removeObjectsAtArrangedObjectIndexes:(NSIndexSet *)indexes;
- (void)removeObject:(id)object;    // removes from the content objects and the arranged objects (if currently contained)
- (void)removeObjects:(NSArray *)objects;

Все это, конечно, для прямого программного контроля над контентом, а не автоматически через Cocoa-Bindings.

person Motti Shneor    schedule 05.07.2021