我正在编写一个非常简单的macOS应用程序,我想在集合视图中显示一些图像。我不需要任何特殊的行为来表现它们。NSCollectionViewItem文档说:
该类的默认实现支持创建显示单个图像或字符串的简单项。
这就是我想要的。但是,我找不到关于如何创建默认NSCollectionViewItem的任何信息。
每个数据源对象都需要实现以下方法: 集合视图:numberOfItemsInSection OfItemsIn合: collectionView:itemForRepresentedObjectAtIndexPath:
上面的第二个方法返回一个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 MyApp28177:3926764 -NSNib _initWithNibNamed:bundle:options:未能在包中加载nibName: NSCollectionViewItem (null)。
然后是堆栈跟踪。
那么,如何创建和使用没有以任何方式子类或修改的NSCollectionViewItem呢?
发布于 2016-12-22 07:20:03
下面是一个非常简单的示例,它使用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;
}
@endNIB只包含一个以文本字段作为视图的NSCollectionViewItem。
增编:,我认为您应该为registerClass变体创建一个NSCollectionViewItem.xib。如果不在loadView中手动创建视图,视图控制器将搜索具有其类名的NIB。因此,如果没有NIB,就不能使用普通的NSCollectionViewItem来注册类,因为makeItemWithIdentifier:forIndexPath:将访问项的视图。
发布于 2021-11-10 07:54:33
我找到了一种不需要添加NSCollectionView文件就可以设置.xib的方法。
诀窍是从NSCollectionViewItem继承并将该子类用于-[NSCollectionView registerClass:forItemWithIdentifier:]。
#import "ViewController.h"
@interface MyViewItem : NSCollectionViewItem
@end
@implementation MyViewItem {
}
- (instancetype)initWithNibName:(NSNibName)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
self = [super initWithNibName:nil bundle:nil];
NSButton *button = [[NSButton alloc] initWithFrame:NSZeroRect];
[button setTitle:@"Button"];
[self setView:button];
return self;
}
@end
@implementation ViewController {
IBOutlet NSCollectionView *_collectionView;
}
- (void)viewDidLoad {
[super viewDidLoad];
[_collectionView registerClass:[MyViewItem class]
forItemWithIdentifier:@"item"];
[_collectionView setDataSource:self];
}
- (NSInteger)collectionView:(NSCollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
return 10;
}
- (NSCollectionViewItem *)collectionView:(NSCollectionView *)collectionView itemForRepresentedObjectAtIndexPath:(NSIndexPath *)indexPath {
return [_collectionView makeItemWithIdentifier:@"item" forIndexPath:indexPath];
}
@endhttps://stackoverflow.com/questions/41233802
复制相似问题