我正在使用Swift为我工作的医院构建一个iOS应用程序。
不知何故,在一个特定的特性中,我必须在UICollectionViewCell中放入一个UICollectionView。我想要实现的是,对于父UICollectionView的每个内容(垂直滚动),都会有几个子项(可以水平滚动),具体取决于父行。
为了说明,我必须显示医生的列表(姓名和照片),然后我必须在他们的姓名和照片下面显示他们的每个实践时间表。实习时间表将根据每个医生的不同而有所不同。因此,我必须将其放入UICollectionView中。
我已经尝试了几个我在网上找到的解决方案,但我仍然无法接近它。
我不能解决的最大问题是:我不知道在代码中哪里可以加载子数据源(doctor schedule),也不知道何时可以加载它,因为我不能拥有下面这样的两个函数:
collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell这就是我想要实现的目标

UIImage和医生姓名(UILabel)在父UICollectionViewCell中(垂直滚动),然后框中的所有内容(练习日和练习时间)都是子UICollectionView (水平滚动)
PS:有很多医生,每个医生都有几天的实习时间。
请教我怎么做
发布于 2019-03-11 13:19:50
这可能有点晚了,但对于仍在努力寻找答案的人来说。
经过一些研究和挖掘,我偶然发现了几个帖子,说明了为什么你不应该让你的细胞作为你的collectionView的代表。所以,我迷失了方向,因为我找到的几乎所有解决方案都是这样做的,直到我最终找到了我认为最好的嵌套collectionViews的方法。
为了提供一些背景知识,我的应用程序在另一个collectionViews的不同单元格中不仅包含了一个,而且包含了两个collectionView,所以使用标记和所有这些来设置委托并不是最好的方法,也不是正确的OO解决方案。
因此,最好的方法是:
首先,您必须创建一个不同的类作为内部collectionView的委托。我是这样做的:
class InnerCollectionViewDelegate: NSObject, UICollectionViewDataSource, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout {
// CollectionView and layout delegate methods here
// sizeForItemAt, cellForItemAt, etc...
}现在,在内部collectionView (更确切地说,是内部collectionView所在的单元格)中创建一个允许您设置其委托的函数
class InnerCell: UICollectionViewCell {
var collectionView: UICollectionView
init() {
let layout = UICollectionViewFlowLayout()
collectionView = UICollectionView(frame: CGRect(x: 0, y: 0, width: frame.width, height: frame.height), collectionViewLayout: layout)
}
func setCollectionViewDataSourceDelegate(dataSourceDelegate: UICollectionViewDataSource & UICollectionViewDelegate) {
collectionView.delegate = dataSourceDelegate
collectionView.dataSource = dataSourceDelegate
collectionView.reloadData()
}
}最后,在拥有最外层(主) collectionView的ViewController中,执行以下操作:
首先实例化内部collectionView的委托
var innerDelegate = InnerCollectionViewDelegate()然后
override func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) {
if let cell = cell as? InnerCell {
cell.setCollectionViewDataSourceDelegate(dataSourceDelegate: innerDelegate)
}
}这可能并不完美,但至少您分离了关注点,因为您的单元不应该是代表。记住,你的单元格应该只负责显示信息,而不是试图计算出collectionView的大小,等等。
我确实找到了类似的答案,涉及设置collectionViews标签和诸如此类的东西,但我发现这使得单独处理每个collectionView变得更加困难,而且处理标签不会导致意大利面代码或意外行为。
我遗漏了单元的注册和出列,但我相信你们都很熟悉这一点。如果没有,请让我知道,我会试着告诉你。
https://stackoverflow.com/questions/44614743
复制相似问题