使用NSBox突出显示NSCollectionView中的选定项目

时间:2012-01-30 15:56:24

标签: objective-c xcode cocoa nscollectionview

如何使用NSCollectionView NSBox更新以显示当前所选项目?在列表中显示选择似乎是一个基本的东西,但我遇到了各种各样的麻烦。

我已阅读此question并查看了Apple的sample code。似乎有几种方法可以做到这一点。

  1. 使用NSCollectionViewItem的子类和特殊的“原型视图”。
  2. 使用NSBox
  3. 我希望使用NSBox方式,因为它似乎很简单,也可以在官方代码示例中使用。

    这显然是按照alternegro的以下引文所述完成的:

      

    如果不同的背景颜色足以作为亮点,那么你可以   只需使用NSBox作为集合项视图的根项。   使用您选择的高亮颜色填充NSBox。设置NSBox   自定义所以填充将起作用。将NSBox设置为透明。

         

    将NSBox的transparency属性绑定到所选属性   文件所有者(集合项)设置值的变换器   透明绑定到NSNegateBoolean。

    我被困在第一部分:“使用NSBox作为你的根项目(原文如此)集合项目视图”。我试图将“自定义类”更改为继承自FoobarBox的{​​{1}},但它似乎没有帮助,因为我无法将背景颜色更改为蓝色,也无法绑定透明度。任何关于如何在我的NSCollectionVuew中显示选择的指针都将不胜感激。

2 个答案:

答案 0 :(得分:3)

首先,为继承自NSBox的ListView创建一个类

 @interface MyListViewBox : NSBox

    @property (unsafe_unretained) IBOutlet NSCollectionViewItem *controller;

 @end

然后,在Interface Builder中,将您的类名指定为“Custom class”属性,如我的屏幕截图所示

screenshot

然后你会发现IB没有在GUI中显示NSBox属性或绑定(至少在版本4.5.2中),所以我决定以编程方式更改属性。

  • 在NSBox子类中创建NSCollectionViewItem的出口(如上所示)
  • 使用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 :(得分:1)

在XCode 4.5.2中,您只需删除NSColletionView自动附带的NSView并拖入NSBox(将具有所有适当的绑定)。确保将CollectionView重新绑定到新Box。