我有UICollectionView
嵌套在另一个ParentCollectionView
,问题是当我设置数据时,数据变得混乱。 “节标题”按顺序设置,但嵌套集合视图不按顺序排列。
这是代码
import UIKit
class HomeView: UIViewController,UICollectionViewDelegate,UICollectionViewDataSource,UICollectionViewDelegateFlowLayout {
@IBOutlet weak var parentCollectionView: UICollectionView!
@IBOutlet weak var collectionViewHeight: NSLayoutConstraint!
let viewModel = HomeVM()
var categories = [ServiceSection]()
var categoriesReversed = [[String:Any]]()
var collectionViewTags = Int()
override func viewDidLoad() {
super.viewDidLoad()
self.categories = [ServiceSection(
section:
["id":"2","name":"planet","service":[
["id":"1","name":"Sun"]
]
]
),
ServiceSection(
section:
["id":"2","name":"Animal","service":[
["id":"1","name":"Dog"]
]
])
,
ServiceSection(
section:
["id":"2","name":"Daries","service":[
["id":"1","name":"Milk"]
]
])
,
ServiceSection(
section:
["id":"2","name":"Meet","service":[
["id":"1","name":"Steak"]
]
])
]
let height = (self.parentCollectionView.collectionViewLayout.collectionViewContentSize.height)
self.collectionViewHeight.constant = height
}
func numberOfSections(in collectionView: UICollectionView) -> Int {
if (collectionView == parentCollectionView)
{
return self.categories.count
}
else
{
collectionView.tag = collectionViewTags
collectionViewTags += 1
return 1
}
}
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
if (collectionView == parentCollectionView){
return 1
}else{
let section = self.categories[collectionView.tag].services
return section.count
}
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
if (collectionView == parentCollectionView){
return collectionView.dequeueReusableCell(withReuseIdentifier: "parentCell", for: indexPath)
}
else
{
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! CollectionCell
let collection = self.categories[collectionView.tag].services
let cellData = collection[indexPath.row]
cell.title.text = cellData.name
return cell
}
}
func collectionView(_ collectionView: UICollectionView,
layout collectionViewLayout: UICollectionViewLayout,
sizeForItemAt indexPath: IndexPath) -> CGSize {
if collectionView == parentCollectionView{
return CGSize(width: parentCollectionView.frame.width, height: 30)
}
return CGSize(width:150,height:80)
}
func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView {
if parentCollectionView == collectionView {
let header = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: "header", for: indexPath) as! CollectionHeader
header.header.text = self.categories[indexPath.section].name
return header
}
return UICollectionReusableView()
}
}
答案 0 :(得分:0)
解释:问题是我将故事板中collectionView
的高度设置为“100”,因为我无论如何都会动态设置它(在collectionView
加载之后但是,这会导致使用reloadData()
时未正确加载视图的奇怪行为。我想操作系统试图做的只是关心屏幕上可见的部分。
第二个问题是由于某些原因(我不知道)我必须使用numberOfSection
作为参数从我之前调用的reloadData重新加载部分,我不知道为什么我需要重新加载每个部分(我很乐意为可以解释它的人投票)
简单:collectionView
取决于身高和身高取决于collectionView
。
解决方案:我不确定这是否是正确的方法,但它适用于我,我将collectionView高度更改为9000或任何大数字,以便操作系统知道它需要加载整个事物并在调用reloadData()
后更正高度。
self.parentCollectionView.reloadData()
let range = Range(uncheckedBounds: (0, self.parentCollectionView.numberOfSections))
let indexSet = IndexSet(integersIn: range)
self.parentCollectionView.reloadSections(indexSet)
let height = (self.parentCollectionView.collectionViewLayout.collectionViewContentSize.height)
self.collectionViewHeight.constant = height