我正在编写一个非常简单的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/

10-11 14:51