NSArraycontroller selectionИндексирует привязки - PullRequest
2 голосов
/ 03 января 2011

У меня есть следующие настройки:

Окно, которое имеет splitView, в котором я отображаю I NSCollectionView в левом представлении и detailView в правом представлении.Оба представления настроены в отдельных XIB.Кроме того, у меня есть Datacontroller (класса NSArrayController), который управляет изменяемым массивом NSMutableDictionaries (moviesForChoice).DataController устанавливается как делегат приложения.Объекты фильма в массиве имеют такие свойства, как (имя, сюжет, жанр и т. Д.)

пока все хорошо ...

В XIB для NScollectionview я связал свойство содержимого NSArraycontroller смой контроллер данных через Application.delegate.moviesForChoice. CollectionView обращается к массивамcontroller.arrrangedObjects и arraycontroller.selectionIndexes.Это прекрасно работает, содержимое отображается, и выделение отлично работает в представлении коллекции (мой collectionviewItem отображает цвет выделения)

В xib для detailView я хочу отобразить информацию для выбранного объекта в представлении коллекции.Поэтому я также добавил arraycontroller в xib, привязал массив содержимого к Application.delegate.moviesForChoice и связал поля NSTextfield в представлении, например, с arraycontroller.selection.name

Вот моя проблема: каждый раз, когда я открываю окнос двумя xibs мое представление коллекции отображает все фильмы, которые являются для выбора правильно, и подробное представление отображает информацию для 1-го объекта в моем представлении коллекции.Всякий раз, когда я нажимаю на другой фильм в коллекции, просмотрите Res.item отображает цвет выделения, но detailView не обновляется.

Насколько я понимаю, DataController не информируется об обновлениях в selectionIndexes и поэтому не может инициировать обновление в detailView.Поправьте меня, если я ошибаюсь ...

Чтобы исправить это, я попытался привязать свойство selectionIndexes массива controltler в xib collectionView к Application.delegate.moviesForChoice.selecionIndexes, но это не удалось с помощью: addObserver: forKeyPath:Параметры: контекст:] не поддерживается.Ключевой путь: selectionIndexes

Я мог бы предположить, что это означает, что контроллер данных не совместим с KVO для моего Array moviesForChoice, но я реализовал следующие методы для него:

  -(void)insertObject:(NSDictionary *)dict inMoviesForChoiceAtIndex:(NSUInteger)index {
    [moviesForChoice insertObject:dict atIndex:index];
}

 -(void)removeObjectFromMoviesForChoiceAtIndex:(NSUInteger)index {
        [moviesForChoice removeObjectAtIndex:index];
    }

-(void)setMoviesForChoice:(NSMutableArray *)a {
    moviesForChoice = a;
}

-(NSArray*)moviesForChoice {
    return moviesForChoice;
}

-(NSUInteger)countOfMoviesForChoice
{
    return [moviesForChoice count];
}

- (void)addMovieForChoiceObject:(Movie *)anObject
{
    [moviesForChoice addObject:anObject];
}

Так где же янеправильно?Как правильно привязать к выделенным индексам?

Ваша помощь очень ценится!M

Ответы [ 2 ]

1 голос
/ 14 сентября 2011

Умный способ справиться с обновлениями выбора - добавить промежуточный объект, который будет обновляться только с выбором, т. Е. В вашем случае я бы создал в бывшем «конструкторе интерфейсов» промежуточный «Контроллер объектов», связанный с текущим выбранным объектом.,Тогда вся связанная с текущим выбранным объектом информация должна быть привязана к этому единственному экземпляру объекта (который должен включать автоматические обновления при его изменении).Это говорит о том, что я также сталкивался со случаем, когда по непонятным причинам интерфейсный объект загружался, но связанные связанные элементы не… (= не обновлялись), в этом случае довольно хорошим решением является работа с наблюдателями для отлова родового действия.вместо того, чтобы иметь дело с назначением щелчка для объекта.Типичным действием является изменение selectionIndex.

[listArrayController addObserver:self forKeyPath:@"selectionIndexes" options:NSKeyValueObservingOptionNew context:nil];  

Затем в вашем классе:

 - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    if([keyPath isEqualTo:@"selectionIndexes"])
    {
/* DO STUFF HERE LIKE BINDING THE OBJECT TO THE CURRENT SELECTION */
    }
}
0 голосов
/ 14 января 2011

К сожалению, ни у кого не было ответа, или, может быть, я не объяснил себя достаточно хорошо.

Итак, я ввел новую переменную в свой dataController, которая заполняется collectionViewItem при каждом нажатии, и я связывал подробный вид с объектом в переменной.

Это руководство, я знаю, но оно делает трюк.

Если кто-нибудь придет с лучшим ответом, не стесняйтесь поделиться. Буду признателен за это.

...