我正在编写一个非常简单的macos应用程序,我想在一个集合视图中显示一些图像。我不需要任何特殊的行为来展示它们。docs for NSCollectionViewItem说:
此类的默认实现支持创建显示单个图像或字符串的简单项。
这就是我想要的。但是,我找不到任何有关如何创建默认NSCollectionViewItem
的信息。
documentation for NSCollectionView表示:
每个数据源对象都需要实现以下方法:
集合视图:numberofitems部分:
集合视图:项目代表项目索引路径:
上面的第二个方法返回NSCollectionViewItem
。通过阅读示例,我发现在本例中创建NSCollectionViewItem
的传统方法是调用:
NSCollectionViewItem* newCollectionViewItem = [imageCollectionView makeItemWithIdentifier:<some identifier>
forIndexPath:indexPath];
问题是我不明白
<some identifier>
应该是什么。我没有包含NSCollectionViewItem
的nib,因为我没有以任何方式对其进行子类化或自定义。我已尝试将以下内容添加到我的数据源:- (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\u initwithnibnamed:bundle:options:]无法在bundle中加载nibname:nsCollectionViewitem(空)。
后面是堆栈跟踪。
那么,如何创建和使用一个没有以任何方式进行子类化或修改的
NSCollectionViewItem
? 最佳答案
下面是一个非常简单的示例,它使用nib作为项目的原型:
@interface ViewController()
@property (weak) IBOutlet NSCollectionView *collectionView;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
NSNib *theNib = [[NSNib alloc] initWithNibNamed:@"Item" bundle:nil];
[self.collectionView registerNib:theNib forItemWithIdentifier:@"item"];
}
#pragma mark NSCollectionViewDataSource
- (NSInteger)numberOfSectionsInCollectionView:(NSCollectionView *)inCollectionView {
return 1;
}
- (NSInteger)collectionView:(NSCollectionView *)inCollectionView numberOfItemsInSection:(NSInteger)inSection {
return 10;
}
- (NSCollectionViewItem *)collectionView:(NSCollectionView *)inCollectionView itemForRepresentedObjectAtIndexPath:(NSIndexPath *)inIndexPath {
NSCollectionViewItem *theItem = [inCollectionView makeItemWithIdentifier:@"item" forIndexPath:inIndexPath];
NSTextField *theLabel = (NSTextField *)theItem.view;
theLabel.stringValue = [NSString stringWithFormat:@"%d.%d", (int)inIndexPath.section, (int)inIndexPath.item];
return theItem;
}
@end
nib只包含一个
NSCollectionViewItem
文本字段作为视图。附录:
我认为您应该为ReistStC类类创建一个
NSCollectionViewItem.xib
。如果在loadView
中没有手动创建视图,则视图控制器将搜索具有其类名的笔尖。因此,如果没有NIB注册类,则不能使用普通NSCollectionViewItem
,因为makeItemWithIdentifier:forIndexPath:
将访问该项的视图。关于objective-c - 如何在不子类化的情况下使用NSCollectionViewItem?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41233802/