要在多个viewControllers中重用的UICollectionView子类

时间:2013-11-09 21:08:23

标签: ios uicollectionview subclass xib

我想创建一个自包含的UICollectionView子类(充当自己的数据源和委托),以便我可以在不同的viewControllers中加载它。这是我到目前为止所做的:

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可以作为自己的数据源和委托吗?
  • 如果可以,如何正确创建此子类的实例以在我的视图控制器中使用?

2 个答案:

答案 0 :(得分:1)

已存在可用于此目的的对象 - UICollectionViewController。这可以是子类并添加到任何视图控制器(作为子视图控制器),并且已经包含一个集合视图,它是数据源和委托。

您当前的方法存在的问题是:

  • 正如您所指出的那样,通过让视图成为自己的数据源和委托来对一个对象施加太多责任
  • xib的文件所有者不能是xib中的对象。加载xib时,发送到owner参数的对象是文件的所有者。我不知道你最终使用你现有的代码到底是什么。
  • 我不知道你为什么坚持使用xib - 除了额外文件的头痛和nib加载的复杂性之外,它给你带来了什么?只需创建一个集合视图控制器,就可以在init和viewDidLoad方法中指定布局和注册单元格。

答案 1 :(得分:0)

首先让视图像视图控制器一样违反了MVC,请你说了 - 所以你不应该这样做。

从理论上讲,可以强迫观点充当代表和&amp;数据源,但我不推荐它。

如果您仍想这样做 - 只需分配代表&amp;数据来源为self

self.dataSource = self;
self.delegate = self;

并在.h文件中采用UICollectionViewDelegateUICollectionViewDataSource协议