项目中需要显示很多影视的信息,类似图片墙那种结构,每个影视信息对应一个Cell。考虑到效率的问题,这种Cell必须能够复用。刚开始考虑使用NSTableView,但是当拉伸窗体时,需要动态的拉伸添加和删除列,非常的费劲。最后看苹果官方关于NSTableView的例子时,发现了NSCollectionView这个控件,查询NSCollectionView这种控件的用法时,发现了BCCollectionView这种控件。 据说当展示大量的数据时,BCCollectionView比苹果官方的NSCollectionView效率高很多。
下面介绍这个控件的使用方式:
1. 创建BCCollectionView
BCCollectionView *collectionView = [[BCCollectionView alloc] initWithFrame:frame];
collectionView.delegate = self;
NSScrollView *scrollview = [[NSScrollView alloc] initWithFrame:frame];
[scrollview setHasVerticalScroller:YES];
[scrollview setAutohidesScrollers:YES];
[scrollview setDocumentView:collectionView];
[self addSubview:scrollview positioned:NSWindowAbove relativeTo:nil];
NSArray *dataSource = [[[NSArray alloc] initWithObjects:@"data1", @"data2", @"data3", @"data3", nil] autorelease];
[collectionView reloadDataWithItems:dataSource emptyCaches:YES];
定义数据源,然后调用函数reloadDataWithItems加载数据。
当调用BCCollectionView的函数reloadDataWithItems后,BCCollectionViewDelegate中定义的回调会被调用。
下面一次说明常用的每个回调用法:
3.1 返回每个Cell的大小
- (NSSize)cellSizeForCollectionView:(BCCollectionView *)collectionView
{
return NSMakeSize(158, 140);
}
- (NSViewController *)reusableViewControllerForCollectionView:(BCCollectionView *)collectionView
{
CellViewController *viewController = [[[CellViewController alloc] init] autorelease];
// 这里可以对viewController进行一个初始化
return viewController;
}
- (void)collectionView:(BCCollectionView *)collectionView willShowViewController(NSViewController *)viewController forItem:(id)anItem
{
CellViewController *cellViewController = (CellViewController *)viewController;
// cellViewController将会显示出来,这里需要对cellViewController设置要显示出来的数据。
}
这里的viewController是将要显示出来的Cell, anItem是dataSource里面的一项。
3.4 当一个Cell不可见时,释放其里面的资源
- (void)collectionView:(BCCollectionView *)collectionView viewControllerBecameInvisible:(NSViewController *)viewController{
CellViewController *cell = (CellViewController*)viewController;
// 这里可以释放cell里面的一些资源
}
3.5 实现一个Cell的点击事件
- (void)collectionView:(BCCollectionView *)collectionView didClickItem:(id)anItem withViewController:(NSViewController *)viewController {
// 这里可以实现针对点击时间的一些处理
}
- (BOOL)collectionViewShouldDrawSelections:(BCCollectionView *)collectionView {
return NO;
}
- (BOOL)collectionViewShouldDrawHover:(BCCollectionView *)collectionView {
return NO;
}
文中出现的CellViewController是自己实现的Cell。