SelectionIndexes на NSArrayController возвращают только значение - PullRequest
6 голосов
/ 05 июля 2011

У меня есть NSCollectionView, содержимое которого обрабатывается NSArrayController.NSCollectionView выбирается, и мне нужно получить список выбранных элементов.Я пытаюсь наблюдать ключевое свойство NSArrayController "selectionIndexes", но оно просто возвращает мне ВСЕГДА значение первого элемента в CollectionView, а не выбранных элементов.

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    if([keyPath isEqualTo:@"selectionIndexes"])
    {
        //True if in the array controller of the collection view really exists at least a selected object
        if([[arrayController selectedObjects] count] > 0)
        {
            NSLog(@"Selected objects: %@", [arrayController selectedObjects]);
        }
        else
        {
            NSLog(@"Observer called but no objects where selected.");
        }
    }
}

UPDATE

Этот метод никогда не вызывается, если я вручную вызываю NSLog (@ "Выбранные объекты:% @", [arrayController selectedObjects]) Я получаю это

В результате всегда получается что-то вроде этого

END UPDATE

2011-07-05 20:44:45.711 collectionView2[2153:903] Selected objects 1: (
    "<Hormiga: 0x10013e330>"
)

Я думаю, что сделал что-то неправильно, связывая NSArrayController с NSCollectionView.В чем может быть моя вина?Скажите, если вам нужна дополнительная информация, я даже могу выложить всю программу в виде zip, если вам это нужно.

ОБНОВЛЕНИЕ 2

Это код, который я использую в своем контроллере для наблюдения за arrayControllerКлюч «selectionIndexes».

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

ОБНОВЛЕНИЕ 3

Одна из проблем была исправлена, я забыл установить привязку между NSArrayController и NSCollectionView относительно ключа «selectionIndexes».Теперь я могу вручную получить список selectedObject и его правильный!

Моя последняя проблема - я не получаю уведомления при изменении selectionIndexes.Так что visibleValueForKeyPath: ofObject: change: context: никогда не вызывать!

UPDATE 4

Я пытался установить наблюдателя в методе init моего контроллера, но таким образом arrayController по-прежнемуноль.Перемещение addObserver в awakeForNib решило все мои проблемы!

1 Ответ

10 голосов
/ 06 июля 2011

Если вы хотите синхронизировать индексы выбора контроллера массива с представлениями коллекции, вам также необходимо связать их.В итоге:

  • Привязка вида коллекции Content к контроллеру массива, ключ arrangedObjects
  • Привязка вида коллекции Selection Indexes к контроллеру массива, ключ selectionIndexes.

Кроме того, убедитесь, что arrayController был установлен, прежде чем добавить наблюдателя.Розетки гарантированно будут установлены в -awakeFromNib и других методах, которые вызываются после него: если вы используете контроллер окна, вы можете использовать -windowDidLoad;если вы используете контроллер вида, вы можете использовать -loadView;в противном случае -applicationDidFinishLaunching: в вашем делегате приложения.

...