我有一個uiviewcontroller,在那裏我把一個uitableview,自定義單元格。每個這些單元格都有一個uicollectionview,並具有水平滾動。CollectionView在Tableview中,與數據源錯誤
我正在以編程方式工作,所以tableviewcell是collectionview的委託/數據源。
我的數據源結構是array of arrays。
我的tableview,對於每個tableviewcell,都有一個tableview部分.Tableview數據源方法使用數組沒有問題。我能夠正確設置tableview。 在這個單元格內,我想顯示一個collectionview,並進行水平滾動。
我遇到的問題是我無法正確使用陣列將數據源分配到collectionview。會發生什麼是當我加載tableview,並向下滾動,我看到重複的記錄,所以例如前3行顯示正確(數據和項目數),但從第四行,例如,數據是所以我再次看到前3行的記錄,當然這不會發生,因爲如果我滾動第4行(第4行的collectionview),應用程序因索引問題而崩潰範圍。
這很容易理解:可以說我在第一行有10個單元格,第四個行/或部分有5個單元格,如果您願意......滾動第4行的集合視圖將導致崩潰。這是因爲從第一行實際上是相同的錯誤數據:相反,我只有5個單元格呈現...
我正在使用的Tecnique非常簡單:給每個tableviewcell的標記實際的indexpath.section 。然後在collectionview中,使用此標記循環訪問數組,然後使用indexpath.item獲取正確的數組。
現在,讓我們一睹爲代碼:
泰伯維
func numberOfSections(in tableView: UITableView) -> Int {
return DataManager.shared.datasource.count
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 1
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as! DiarioTableViewCell
cell.tag = indexPath.section
return cell
}
TableviewCell
override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
super.init(style: .default, reuseIdentifier: "cell")
collectionView.register(DiarioCVCell.self, forCellWithReuseIdentifier: "cellCV")
collectionView.delegate = self
collectionView.dataSource = self
DataManager.shared.istanzaCV = self.collectionView
addSubview(tableCellBG)
addSubview(collectionView)
setConstraints()
}
的CollectionView
func numberOfSections(in collectionView: UICollectionView) -> Int {
return 1
}
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
let tvCell = collectionView.superview as! DiarioTableViewCell
return DataManager.shared.datasource[tvCell.tag].count
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cellCV", for: indexPath) as! DiarioCVCell
let celltag = (collectionView.superview as! DiarioTableViewCell).tag
cell.datasource = DataManager.shared.datasource[celltag][indexPath.item]
return cell
}
請注意,我已經閱讀了所有可能的相關主題,甚至ashfurrow的文章,以及這裏的堆棧,但我無法找到解決方案。 感謝您的幫助!
所以基本上這個錯誤是由於丟失了總是有相同內容的collectionview的重新加載而導致的?我被困了3周,我簡直不敢相信這很簡單。謝謝你LOTMichałKwiecień! – Simone
@MichałKwiecień,你能幫我看看我的問題bro https://stackoverflow.com/questions/45074376/uicollection-view-inside-table-cell-does-not-show-images-in-swift- 3? –
'cell.collectionView.collectionViewLayout.invalidateLayout()'幫助我修復類似的崩潰。謝啦。 – abhi1992