2

我想创建一个自包含的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
  • File's Owner 是UICollectionView的委托人和数据源

我知道我在这里有很多问题。但也许我们可以以此为起点。

我的问题是:

  • 如何正确实现这个子类?我想从 xib 完全加载视图
  • 首先,除了潜在的 MVC 违规(这个子类会做这一切)之外,UICollectionView 可以成为它自己的数据源和委托吗?
  • 如果上述可能,我如何正确创建此子类的实例以在我的视图控制器中使用?
4

2 回答 2

1

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

您当前方法的问题是:

  • 正如您所指出的,通过将视图作为其自己的数据源和委托,您将过多的责任放在一个对象上
  • xib 的文件所有者不能是 xib 中的对象。当您加载 xib 时,您发送给owner参数的对象是文件的所有者。我不知道您最终使用您当前拥有的代码最终会得到什么。
  • 我不确定你为什么坚持使用 xib - 除了额外文件的头痛和 nib 加载的复杂性之外,这会给你带来什么?只需创建一个集合视图控制器,您可以在 init 和 viewDidLoad 方法中指定布局和注册单元格。
于 2013-11-10T08:04:09.450 回答
0

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

从理论上讲,可以强制视图充当委托和数据源,但我不推荐它。

如果您仍然想这样做 - 只需将委托和数据源分配给self

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

并在 .h 文件中采用UICollectionViewDelegate和协议UICollectionViewDataSource

于 2013-11-09T21:28:15.227 回答