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文件中采用UICollectionViewDelegateUICollectionViewDataSource协议

【讨论】:

感谢您的回复。正如你在 .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 子类上触发

uicollectionview下拉调用哪个方法