首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何不用子类来使用NSCollectionViewItem?

如何不用子类来使用NSCollectionViewItem?
EN

Stack Overflow用户
提问于 2016-12-20 01:59:22
回答 2查看 3K关注 0票数 4

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

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

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

NSCollectionView文档指出:

每个数据源对象都需要实现以下方法: 集合视图:numberOfItemsInSection OfItemsIn合: collectionView:itemForRepresentedObjectAtIndexPath:

上面的第二个方法返回一个NSCollectionViewItem。通过阅读示例,我认为在本例中创建NSCollectionViewItem的传统方法是调用:

代码语言:javascript
复制
NSCollectionViewItem*   newCollectionViewItem   = [imageCollectionView makeItemWithIdentifier:<some identifier>
                                                                                     forIndexPath:indexPath];

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

代码语言:javascript
复制
- (void)awakeFromNib
{
    [imageCollectionView registerClass:[NSCollectionViewItem class]
                 forItemWithIdentifier:@"Image"];
}

其中imageCollectionView是问题中的NSCollectionView。然后在我的- (NSCollectionViewItem *)collectionView:itemForRepresentedObjectAtIndexPath:方法中,我调用:

代码语言:javascript
复制
NSCollectionViewItem*   newCollectionViewItem   = [imageCollectionView makeItemWithIdentifier:@"Image"
                                                                                     forIndexPath:indexPath];

但是这会抛出一个异常并将其打印到控制台:

2016-12-19 17:51:27.463 MyApp28177:3926764 -NSNib _initWithNibNamed:bundle:options:未能在包中加载nibName: NSCollectionViewItem (null)。

然后是堆栈跟踪。

那么,如何创建和使用没有以任何方式子类或修改的NSCollectionViewItem呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-12-22 07:20:03

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

代码语言:javascript
复制
@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

增编:,我认为您应该为registerClass变体创建一个NSCollectionViewItem.xib。如果不在loadView中手动创建视图,视图控制器将搜索具有其类名的NIB。因此,如果没有NIB,就不能使用普通的NSCollectionViewItem来注册类,因为makeItemWithIdentifier:forIndexPath:将访问项的视图。

票数 3
EN

Stack Overflow用户

发布于 2021-11-10 07:54:33

我找到了一种不需要添加NSCollectionView文件就可以设置.xib的方法。

诀窍是从NSCollectionViewItem继承并将该子类用于-[NSCollectionView registerClass:forItemWithIdentifier:]

代码语言:javascript
复制
#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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41233802

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档