Выделение выбранного элемента в NSCollectionView с помощью NSBox

Как сделать обновление NSCollectionView для отображения текущего выбранного элемента с помощью NSBox? Отображение выбора в списке кажется базовой вещью, но у меня с этим возникают всевозможные проблемы.

Я прочитал этот вопрос, а также просмотрел пример кода от Apple. Кажется, есть несколько способов сделать это.

  1. Использование подклассов NSCollectionViewItem и специального "прототипа".
  2. Используя NSBox.

Я хочу использовать способ NSBox, так как он кажется простым и также используется в официальном примере кода.

По-видимому, это сделано, как описано в следующей цитате alternegro:

Если в качестве выделения будет достаточно другого цвета фона, вы можете просто использовать NSBox в качестве корневого элемента для представления элемента коллекции. Заполните NSBox цветом выделения по вашему выбору. Установите для NSBox значение Custom, чтобы заливка работала. Установите для NSBox прозрачность.

Свяжите атрибут прозрачности NSBox с выбранным атрибутом владельца файла (элемент коллекции). Установите преобразователь значения для прозрачной привязки в NSNegateBoolean.

Я застрял в самой первой части: «используйте NSBox в качестве корневого элемента для вашего (так в оригинале) представления элемента коллекции». Я попытался изменить «Пользовательский класс» на FoobarBox, который наследуется от NSBox, но, похоже, это не помогает, поскольку я не могу изменить цвет фона на синий и не могу привязать прозрачность. Любые указатели на то, как сделать отображение выбора в моем NSCollectionVuew, будут оценены.


person vidstige    schedule 30.01.2012    source источник


Ответы (2)


В XCode 4.5.2 вы можете просто удалить NSView, который автоматически поставляется с NSColletionView, и перетащить его в NSBox (в котором будут доступны все соответствующие привязки). Убедитесь, что вы повторно привязываете CollectionView к своему новому ящику.

person Algae    schedule 28.01.2013

Сначала создайте класс для вашего ListView, который наследуется от NSBox.

 @interface MyListViewBox : NSBox

    @property (unsafe_unretained) IBOutlet NSCollectionViewItem *controller;

 @end

Затем в Interface Builder укажите имя вашего класса как свойство «Пользовательский класс», как показано на моем снимке экрана.

скриншот

Затем вы поймете, что IB не показывает свойства или привязку NSBox в графическом интерфейсе (по крайней мере, с версией 4.5.2), поэтому я решил изменить свойства программно.

  • Создайте выход для NSCollectionViewItem в вашем подклассе NSBox (как показано выше)
  • Используйте IB, чтобы связать выход с вашим NSCollectionItemView

  • в -(void)awakeFromNib для вашего подкласса NSBox добавьте следующий код

    -(void)awakeFromNib { 
    
      //properties are not showing up in XCode Inspector IB view
      //configuring the box here :-(
    
      self.boxType = NSBoxCustom;
      self.borderType = NSLineBorder;
      self.fillColor = [NSColor selectedControlColor];
    
      //bind the "transparent" property of NSBox to the "selected" property of NSCollectionViewItem controller
      //controller is bound as IBOutlet in IB
      NSValueTransformer* transformer = [NSValueTransformer valueTransformerForName:NSNegateBooleanTransformerName];
      [self bind:@"transparent"
        toObject:self.controller 
        withKeyPath:@"selected"
        options:[NSDictionary dictionaryWithObjectsAndKeys:transformer, NSValueTransformerBindingOption, nil]];
    }
    
person Sébastien Stormacq    schedule 23.12.2012
comment
Спасибо, что копаетесь в этом. Я попробовал ваше решение, но оно не показывало выбранный элемент. - person vidstige; 25.12.2012