4

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

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

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

NSCollectionView的文档指出:

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

集合视图:numberOfItemsInSection:

集合视图:itemForRepresentedObjectAtIndexPath:

上面的第二种方法返回一个NSCollectionViewItem. 从阅读示例中,我了解到NSCollectionViewItem在这种情况下创建的传统方法是调用:

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

问题是我不明白<some identifier>应该是什么。我没有包含 an 的笔尖,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:] 无法加载 nibName: NSCollectionViewItem 捆绑包(空)。

其次是堆栈跟踪。

那么我如何去创建和使用一个NSCollectionViewItem没有子类化或以任何方式修改的?

4

2 回答 2

3

这是一个非常简单的示例,它使用 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带有文本字段的视图。

附录: 我认为您应该NSCollectionViewItem.xib为 registerClass 变体创建一个。如果您没有在loadView. 因此,您不能使用NSCollectionViewItem没有NIB 的plain 来注册类,因为makeItemWithIdentifier:forIndexPath:会访问该项目的视图。

于 2016-12-22T07:20:03.407 回答
0

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];
}

@end
于 2021-11-10T07:54:33.713 回答