用 nib 定义 UICollectionViewCell

Posted

技术标签:

【中文标题】用 nib 定义 UICollectionViewCell【英文标题】:Defining UICollectionViewCell with nib 【发布时间】:2012-11-16 11:55:17 【问题描述】:

如果我理解正确,UICollectionViewCell 的内容应该放在它的 contentView 属性中,而背景应该放在 backgroundView 中。

然而,当我将 UICollectionViewCell 拖到 Interface Builder 时,并没有提到 contentViewbackgroundView。如果我添加子视图,它们会将整个单元格作为其父级,而不是 contentViewbackgroundView

那么,用 IB 定义 UICollectionViewCell 的正确方法是什么?

【问题讨论】:

【参考方案1】:

“如果我添加子视图,它们会将整个单元格作为其父级,而不是 contentView”

这不是真的。如果您拖入 UICollectionViewCell,并向其中添加 UI 元素,您就是将它们添加到内容视图中。它没有出现在对象列表中的事实并不意味着它不存在(NSBox 也是如此——它有一个内容视图也没有出现在 IB 中)。如果在 collectionView:didSelectItemAtIndexPath: 中,您记录 cellForItemAtIndexPath,并查看它的子视图,您只会找到一个,这与您通过记录 cell.contentView 获得的相同。如果您记录其子视图,那么您将看到您的 UI 元素。

现在,就背景视图而言,我不认为这是您可以从 IB 访问的内容。您可以拥有一个带有 UIView 的 xib 文件,然后将其分配给单元格的 backgroundView 属性。

【讨论】:

半真。我以前试过这个,但没有用。但是,我拖了一个 UIView 并将类型更改为 UICollectionViewCell 子类。仅当您完全按照您所说的进行操作时才有效:从库中拖动 UIColllectionViewCell 然后更改类型。非常hacky。 @hpique,在子类化之前,您必须从正确类型的对象开始。从 UICollectionViewCell 开始,您将获得它的所有默认属性和数据,而您不会使用 UIView 获得这些 - 这没有什么不好的。 这很糟糕,因为 contentView 是隐含的。由于我看不到它,因此我无法通过反复试验知道从一种类型或另一种类型开始会有所不同。 hacky,因为如果您仅为您的单元格创建一个 nib 文件(通过[UICollectionView registerNib: forCellWithReuseIdentifier:] 支持,则默认情况下将 nib 创建为 UIView。我尽管更改为正确的派生类型,但无法弄清楚如何让 contentView 属性工作。 忽略这一点,我必须拖动 UICollectionViewCell,然后删除它创建的默认 UIView 才能使其正常工作。【参考方案2】:

由于没有更好的选择,我为contentViewbackgroundView 使用单独的笔尖文件。然后在我的UICollectionViewCell 子类中:

- (id)initWithFrame:(CGRect)frame

    self = [super initWithFrame:frame];
    if (self)
    
        NSArray *contentViewNib = [[NSBundle mainBundle] loadNibNamed:@"CollectionViewCellContentView" owner:self options:nil];
        [self.contentView addSubview:contentViewNib[0]];
        NSArray *backgroundViewNib = [[NSBundle mainBundle] loadNibNamed:@"CollectionViewCellBackgroundView" owner:self options:nil];
        self.backgroundView = backgroundViewNib[0];
    
    return self;

【讨论】:

那么你只是在集合视图中注册你的类,然后在单元类的 initWithFrame 上加载你的 xibs 吗? 那么您是否可以通过代码访问您在 xib 上设置的任何网点? 这样做,据我所知,只有当您不打算更改这些 xibs 的任何内容时才会这样做。你不会有动态内容、标签或文本字段在这些 xib 中每个单元格都会发生变化吗? 使用 [self.contentView addSubview:contentViewNib[0]];不错! @tote 为什么不能是动态的?我遇到了你提到的问题;如果我使用这种方法,我所有的 IBOutlet 都为零。【参考方案3】:

我不确定这是否是 Xcode 8 的新功能,但 UICollectionViewCell 包含用于连接 backgroundViewselectedBackgroundView 的插座。

因此,您可以将UIView(或子类)添加到您的收藏视图单元格,并将其连接到任一出口。这样您就可以使用 IB 来定义它们。

希望这会有所帮助!

【讨论】:

以上是关于用 nib 定义 UICollectionViewCell的主要内容,如果未能解决你的问题,请参考以下文章

UICollectionView 中的 Nib Cell 注册不显示

IOS UICollectionView 为 UICollectionViewCell 注册 nib 不起作用

UICollectionView,来自注册为单元格的框架目标的 nib 在运行时失败

iOS UICollectionView 动态切换单元格NIB

在 iOS 12 中,UICollectionView 何时布局单元格,在 nib 中使用 autolayout

无法在捆绑包中加载 NIB。可可豆项目