【问题标题】:UICollectionView subclass to be reused in multiple viewControllersUICollectionView 子类可在多个 viewController 中重用
【发布时间】: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 可以作为自己的数据源和委托吗?
  • 如果上述方法可行,如何正确创建此子类的实例以在我的视图控制器中使用?

【问题讨论】:

    标签: ios uicollectionview subclass xib


    【解决方案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 和委托。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-07
    • 1970-01-01
    相关资源
    最近更新 更多