2

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

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

до сих пор так хорошо ...

В XIb для NScollectionview я связан свойство контента NSArraycontroller моей datacontroller по применению .delegate.moviesForChoice CollectionView обращается к массиву control.errrangedObjects и arraycontroller.selectionIndexes. Это прекрасно работает, содержимое отображается, и выбор отлично работает в коллекции (мой collectionviewItem отображает цвет выделения)

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

Приходит моя проблема: каждый раз, когда я открываю окно с двумя xibs, my collectionview отображает все фильмы, которые для выбора правильно, а detailview отображает информацию для 1-го объекта в моем представлении коллекции. Всякий раз, когда я нажимаю на другой фильм в коллекцииView, res. элемент отображает цвет выделения, но detailView не обновляется.

Мое понимание этого было бы в том, что DataController не информирован об обновлениях в selectIndexes и поэтому не может инициировать обновление в detailView. Поправьте меня, если я ошибаюсь ...

Чтобы исправить это я пытался связать свойство selectionIndexes из arraycontroller в CollectionView XIb к Application.delegate.moviesForChoice.selecionIndexes, но это не удалось с: addObserver: forKeyPath: варианты : context:] не поддерживается. Ключевой путь: selectionIndexes

я мог себе представить, что это означает, что datacontroller не KVO соответствует моему массиву 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]; 
} 

Итак, где я не права? Как правильно привязать к selectIndexes?

Вы очень благодарны за помощь! M

ответ

0

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

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

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

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

1

умный способ справиться с обновлениями выбора заключается в том, чтобы добавить промежуточный объект, который будет обновляться только с выбором i.e.в вашем случае я бы создал в прежнем «интерфейсе строителя» посредника «Object Controller», связанного с текущим выбранным объектом. Затем вся связанная информация с текущим выбранным объектом должна быть привязана к этому экземпляру одного объекта (который должен включать автоматические обновления при его изменении). Это сказало, что я также испытал случай, когда без видимых причин интерфейс objet загрузился, но связанные связанные элементы не ... (= не были обновлены), в этом случае довольно хорошим решением является работа с наблюдателями для обнаружения общих вместо того, чтобы иметь дело с назначением по каждому объекту. Типичным действием является изменение выбораIndex.

[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 */ 
    } 
} 
Смежные вопросы