如何使用NSCollectionViewItem而不进行子类化?

时间:2016-12-20 01:59:23

标签: objective-c macos nscollectionview nscollectionviewitem

我正在编写一个非常简单的macOS应用程序,我想在集合视图中显示一些图像。我对它们的显示方式不需要任何特殊的行为。 docs for NSCollectionViewItem说:

  

此类的默认实现支持创建显示单个图像或字符串的简单项目。

这就是我想要的。但是,我找不到有关如何创建默认NSCollectionViewItem的任何信息。

documentation for NSCollectionView州:

  

每个数据源对象都需要实现以下方法:

     

的CollectionView:numberOfItemsInSection:

     

的CollectionView:itemForRepresentedObjectAtIndexPath:

上面的第二种方法返回NSCollectionViewItem。通过阅读示例,我收集到在这种情况下创建NSCollectionViewItem的传统方法是调用:

NSCollectionViewItem*   newCollectionViewItem   = [imageCollectionView makeItemWithIdentifier:<some identifier>
                                                                                     forIndexPath:indexPath];

问题在于我不明白<some identifier>应该是什么。我没有包含NSCollectionViewItem的笔尖,因为我没有对其进行子类化或以任何方式自定义它。我已经尝试将以下内容添加到我的数据源中:

- (void)awakeFromNib
{
    [imageCollectionView registerClass:[NSCollectionViewItem class]
                 forItemWithIdentifier:@"Image"];
}

其中imageCollectionView是有问题的NSCollectionView。然后在我的- (NSCollectionViewItem *)collectionView:itemForRepresentedObjectAtIndexPath:方法中,我打电话给:

NSCollectionViewItem*   newCollectionViewItem   = [imageCollectionView makeItemWithIdentifier:@"Image"
                                                                                     forIndexPath:indexPath];

但是这会引发异常并将其打印到控制台:

  

2016-12-19 17:51:27.463 MyApp [28177:3926764] - [NSNib _initWithNibNamed:bundle:options:]无法在bundle(null)中加载nibName:NSCollectionViewItem。

然后是堆栈跟踪。

那么我该如何创建和使用未以任何方式进行子类化或修改的NSCollectionViewItem

1 个答案:

答案 0 :(得分:3)

这是一个非常简单的例子,它使用Nib作为项目的原型:

NSCollectionViewItem

NIB只包含一个NSCollectionViewItem.xib,其中包含一个文本字段作为视图。

<强>附录: 我认为你应该为registerClass变体创建一个loadView。如果您未在NSCollectionViewItem中手动创建其视图,则视图控制器将搜索具有其类名的NIB。因此,您不能使用普通makeItemWithIdentifier:forIndexPath:而不使用NIB来注册课程,因为@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_background_gif); ImageView imageView = (ImageView) findViewById(R.id.gifImageView); //Glide.with(this).load(getResources().getDrawable(R.drawable.sample_img)).into(imageView); Glide.with(this) .load("http://more-sky.com/data/out/6/IMG_105566.gif") .into(new GlideDrawableImageViewTarget(imageView)); } 将访问该项目的视图。