Обновление содержимого NSOutlineView
У меня есть NSOutlineView, который показывает контент, контролируемый NSTreeController, который я связываю с NSMutableArray (arrayOfFiles). Массив содержит объекты NSTreeNode, где presentObject (класс Fileobject) содержит несколько иваров. Я хотел бы редактировать и обновлять ивар с именем "направление" для конкретных объектов. Мне удается получить интересующий меня объект, используя NSIndexPath, который я сохранил для каждого объекта.
[self.myOutlineViewController.myTreeController setSelectionIndexPath:myIndexPath];
Fileobject *myObject =[[[self.myOutlineViewController.myTreeController.arrangedObjects descendantNodeAtIndexPath:myIndexPath] representedObject] representedObject];
[myObject setDirection:0];
Это работает нормально, но у меня возникают проблемы, когда я хочу обновить объект, который я только что извлек в NSIndexPath. Следующие сбои:[self.myOutlineViewController.myTreeController removeObjectAtArrangedObjectIndexPath:myIndexPath];
с сообщением об ошибке
An uncaught exception was raised
2012-11-08 17:23:25.557 S3access[20379:12b03] *** -[NSKeyValueSlowMutableArray removeObjectsAtIndexes:]: value for key myArrayOfFiles of object 0x40012e460 is nil
Я понимаю, что я делаю что-то не так с кодированием значения ключа здесь, но я не могу понять, что это такое. Я пытался найти решения во всех примерах от Apple, но я могу найти только примеры, в которых не используются NSTreeController и NSTreeNode. Я думал: 1) извлечь объект в indexpath 2) отредактировать извлеченный объект 3) удалить текущий объект в indexpath 4) вставить мой новый отредактированный объект в indexpath с помощью команды [self.myOutlineViewController.myTreeController insertObject:myNode atArrangedObjectIndexPath:myIndexPath];
, Я не понимаю, как я могу заменить свой объект, используя кодирование значения ключа, когда я не заменяю только ivar, но весь объект?
Любые предложения о том, что я делаю неправильно, и предложения о том, как я могу решить эту проблему, очень ценятся.
Ура и спасибо! Тронд
1 ответ
Мне наконец удалось заставить мое обновление NSOutlineView работать должным образом, и так как мой вопрос был чрезвычайным, я думал, что по крайней мере обновлю с ответом. Оказывается, моей проблемой было скорее отсутствие правильного понимания KVC, а не проблемы программирования. Прочитав ответы на вопросы о Stackru и документации Apple, я, наконец, выяснил, как включить динамическое обновление моего NSOutlineView и его содержимого NSTreeController (ограммы Objects), которые представлены с использованием NSTreeNode. Следующий код работал для меня, предполагая, что вы знаете NSIndexPath (myIndexPath) вашего объекта:
[self.myOutlineViewController.myOutlineView willChangeValueForKey:@"direction"];
[[[[self.myOutlineViewController.myTreeController.arrangedObjects descendantNodeAtIndexPath:myIndexPath] representedObject] representedObject] setDirection:0];
[self.myOutlineViewController.myOutlineView didChangeValueForKey:@"direction"];
Надеюсь, это может помочь некоторым другим. Ура, Тронд