UICollectionView 子类可在多个 viewController 中重用
Posted
技术标签:
【中文标题】UICollectionView 子类可在多个 viewController 中重用【英文标题】:UICollectionView subclass to be reused in multiple viewControllers 【发布时间】:2013-11-09 21:08:22 【问题描述】:我想创建一个自包含的UICollectionView
子类(充当它自己的数据源和委托),以便我可以在不同的视图控制器中加载它。到目前为止,这是我所拥有的:
CustomCollectionView.h
@interface CustomCollectionView : UICollectionView <UICollectionViewDataSource, UICollectionViewDelegate>
@property (weak, nonatomic) IBOutlet UICollectionView *collectionView;
@end
CustomCollectionView.m
#import "SSCalendarView.h"
@implementation SSCalendarView
@synthesize collectionView;
- (id)initWithFrame:(CGRect)frame
self = [super initWithFrame:frame];
if (self)
[[NSBundle mainBundle] loadNibNamed:NSStringFromClass([self class]) owner:self options:nil];
[self registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:@"Identifier"];
[self addSubview:collectionView];
return self;
// Below are UICollectionViewDataSource and UICollectionViewDelegate methods
@end
CustomCollectionView.xib
仅包含一个视图 -UICollectionView
。它的类设置为CustomCollectionView
文件所有者的类也设置为CustomCollectionView
文件的所有者是UICollectionView
的代表和数据源
我知道我在这里有很多问题。但也许我们可以以此为起点。
我的问题是:
如何正确实现这个子类?我想完全从 xib 加载视图 首先,除了潜在的 MVC 违规(这个子类可以解决所有问题)之外,UICollectionView 可以作为自己的数据源和委托吗? 如果上述方法可行,如何正确创建此子类的实例以在我的视图控制器中使用?【问题讨论】:
【参考方案1】:已经存在一个可用于此目的的对象 - UICollectionViewController
。这可以子类化并添加到任何视图控制器(作为子视图控制器),并且已经包含一个集合视图,它是数据源和委托。
您当前方法的问题是:
正如您所指出的,通过将视图作为其自己的数据源和委托,您将过多的责任置于一个对象身上 xib 的文件所有者不能是 xib 中的对象。当您加载 xib 时,您发送到owner
参数的对象是文件的所有者。我不知道您最终使用您当前拥有的代码最终会得到什么。
我不知道你为什么坚持使用 xib - 除了额外文件的头痛和 nib 加载的复杂性之外,这会给你带来什么?只需创建一个集合视图控制器,您可以在 init 和 viewDidLoad 方法中指定布局和注册单元格。
【讨论】:
你说得对,我只需要阅读一些苹果文档here【参考方案2】:首先让视图像视图控制器一样是违反 MVC 的,问你这么说 - 所以你不应该这样做。
理论上可以强制视图充当委托和数据源,但我不推荐它。
如果您仍想这样做 - 只需将委托和数据源分配给 self
:
self.dataSource = self;
self.delegate = self;
并在.h文件中采用UICollectionViewDelegate
和UICollectionViewDataSource
协议
【讨论】:
感谢您的回复。正如你在 .h 中看到的,我已经采用了你提到的协议,并且我已经通过 IB(文件的所有者,在这种情况下是 self)连接了 dataSource 和委托。以上是关于UICollectionView 子类可在多个 viewController 中重用的主要内容,如果未能解决你的问题,请参考以下文章
在 UICollectionView 子类中实现 UIScrollViewDelegate
c_cpp 令人敬畏的优化AVPlayer,可在UICollectionView / UITableView中平滑滚动AVPlayerLayer(在iOS10 +上测试)
c_cpp 令人敬畏的优化AVPlayer,可在UICollectionView / UITableView中平滑滚动AVPlayerLayer(在iOS10 +上测试)
UICollectionView 在 UIScrollView 内调整大小
UICollectionViewDelegate 没有在具有自定义 UICollectionViewCell 和 NSObject 控制器的 UICollectionView 子类上触发