iOS 使用多个 CollectionView 重用同一个单元格

Posted

技术标签:

【中文标题】iOS 使用多个 CollectionView 重用同一个单元格【英文标题】:iOS Use multiple CollectionView reusing the same cell 【发布时间】:2018-01-25 09:17:05 【问题描述】:

我是 ios 编程新手,但根据我使用 android 的经验,我知道您可以为一个项目创建一个设计,该设计可以在多个列表中重复使用,而无需创建副本。

在 iOS 中,我一直在尝试与 UICollectionView 相同的方法。

在我看来,我创建了三个水平 UICollectionViews(具有不同的数据集),它们又使用自己的单元格(与其他单元格相同)。我不知道如何让其他两个集合使用第一个单元格,所以我不需要一遍又一遍地重新创建同一个单元格。

【问题讨论】:

如果您使用情节提要,则需要创建原型单元 3 次,但您可以为每个单元使用相同的自定义类。 您可以将 xib 用于您将重复使用的单元格,并为每个集合视图注册它。 很好!你有我可以效仿的例子吗?链接? @Oreex0 寻找“Custom UICollectionViewCell Xib Swift”,你应该会得到很多问题或教程。其中一些可能在“Old Swift”中,但是使用自动完成功能应该很容易找到该方法的新版本,因为整个逻辑保持不变。如果你懂一点 Objective-C,你也可以找到教程。 【参考方案1】:

您无法使用单个情节提要实现此目的。如果要使用 Interface Builder (xml) 文件进行布局,则应创建 MyCell.xib 文件,然后将 UICollectionViewCell 拖到该文件上并使用该 xib。 然后你应该将 .xib 文件与你的集合视图连接起来,如下所示: let nib = UINib(nibName: "MyCell", bundle: nil) collectionView?.register(nil, for: "MyCellReuseID") 现在您可以使用您的手机了。

您也可以创建 MyCell: UICollectionViewCell 类而不创建 .xib 文件,以编程方式在其上创建视图,然后调用 collectionView?.register(MyCell.self, for: "MyCellReuseID")

【讨论】:

【参考方案2】:

在您的函数collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell 中,您可以通知您的collectionview 使用哪个单元格

如果你定义了你的单元格,你可能会有类似的东西

 class MyCell: UICollectionViewCell
    var Label: UILabel!
    var imageView: UIImageView!

所以进入你的函数collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath)你需要通知你的collectionview使用哪个单元格

collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell 
 let cell:MyCell = collectionView.dequeueReusableCellWithReuseIdentifier("myCell", forIndexPath: indexPath) as! MyCell
[...]

别忘了先注册你的手机

override func viewDidLoad()         
        super.viewDidLoad()
        //do your stuff
        collectionView.delegate = self
        collectionView.dataSource = self
        collectionView.backgroundColor = UIColor.whiteColor()
        collectionView.registerClass(MyCell.self, forCellWithReuseIdentifier: "myCell")

瞧!

【讨论】:

感谢您的快速回复,我一直在玩这个,现在我在展开时得到了零。来自 cell.label xib 文件有我的类和“cell”作为标识符。在情节提要的 CollectionView 中,我将单元格设置为相同的标识符和类。 解决了,注册了 registerNib(UINib.init(nibname: "MyCell", bundle: nil), forcell..:"myCell_identifier")【参考方案3】:
    使用 XIB 创建新的文件收集单元 在视图控制器中的“索引行中的项目”委托方法中,初始化单元格并返回它。 现在视图控制器中的任何集合视图都具有相同的单元格

【讨论】:

到此链接查看完整教程samwize.com/2016/04/06/…【参考方案4】:

通过将UICollectionViewCell 作为基类来创建一个 Swift 类(CollectionViewCell)。执行此操作时选择创建 nib 选项。

然后创建一个视图控制器并将集合视图添加到您的故事板中,并将这个自定义单元类连接到Identity Inspector。基本上,您的结构需要如下所示

【讨论】:

以上是关于iOS 使用多个 CollectionView 重用同一个单元格的主要内容,如果未能解决你的问题,请参考以下文章

具有多个 collectionView 控制器的 iOS 屏幕错误地调用 cellForItemAtIndexPath

如何在 swift ios 的自定义 collectionView 单元中将字符串值显示到多个标签?

collectionview admob ios中的横幅广告

切换到不同的流布局后如何在collectionview单元格内重绘视图?

ios - 使用图像水平滚动collectionView

IOS10 - 在自定义 inputView 中使用 CollectionView