2017-03-01 72 views
0

我有一個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的文章,以及這裏的堆棧,但我無法找到解決方案。 感謝您的幫助!

回答

2

嘗試在單元格顯示時重新加載收藏視圖。單元格被重用來節省內存,所以它們只被創建一次 - 您將在init中設置所有數據,並且它永遠在那裏。

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 

    let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as! DiarioTableViewCell 
    cell.tag = indexPath.section 
    cell.collectionView.reloadData() 
    cell.collectionView.collectionViewLayout.invalidateLayout() //just to be sure, maybe it's not necessary 

    return cell 
} 
+0

所以基本上這個錯誤是由於丟失了總是有相同內容的collectionview的重新加載而導致的?我被困了3周,我簡直不敢相信這很簡單。謝謝你LOTMichałKwiecień! – Simone

+0

@MichałKwiecień,你能幫我看看我的問題bro https://stackoverflow.com/questions/45074376/uicollection-view-inside-table-cell-does-not-show-images-in-swift- 3? –

+0

'cell.collectionView.collectionViewLayout.invalidateLayout()'幫助我修復類似的崩潰。謝啦。 – abhi1992

相關問題