Подсветка выделенного элемента в NSCollectionView с использованием NSBox - PullRequest
2 голосов
/ 30 января 2012

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

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

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

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

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

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

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

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

Ответы [ 2 ]

3 голосов
/ 23 декабря 2012

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

 @interface MyListViewBox : NSBox

    @property (unsafe_unretained) IBOutlet NSCollectionViewItem *controller;

 @end

Затем в Интерфейсном Разработчике укажите имя вашего класса как свойство "Пользовательский класс", как показано на моем скриншоте

screenshot

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

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

  • in - (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]];
    }
    
1 голос
/ 29 января 2013

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

...