2017-03-09 92 views
0

我想實現與IGListKit的集合視圖。它可以有一個或三個部分。數據源實時填充,因此需要在新數據可用時刷新內容。IGListKit與部分和多個項目

要做到這一點,我創建了一個數據源對象符合IGListDiffable表示每個部分這樣:

final class DataSource: NSObject { 
    var title: String? 
    var items: [SJResult] = [] 
} 

extension DataSource: IGListDiffable { 
    public func diffIdentifier() -> NSObjectProtocol { 
    return self 
    } 

    public func isEqual(toDiffableObject object: IGListDiffable?) -> Bool { 
    if object === self { 
     return true 
    } 
    guard let obj = object as? DataSource else { 
     return false 
    } 
    return obj.items.count == items.count 
    } 
} 

內部各部分,我想顯示的items列表。我設法通過重用相同的部分控制器來創建該部分,但我發現插入新結果的唯一方法是在適配器上調用reloadData()。這非常糟糕,因爲它會重新載入完整的項目列表(可能會很長,> 50項)。它也不可能動畫插入新項目。我也試過做adapter.performUpdates(animated: true)沒有運氣,因爲它只刷新我的數據源,而不是數據源內的項目。

我然後試圖創建節控制器,其將顯示每個部分與一個小區。該單元格將包含一個IGListCollectionView,並將照顧顯示items,但與此我沒有運氣,儘管第二節控制器接收它從不顯示單元格的對象。

我現在不知道我怎麼可以顯示三個不同的部分使用相同類型的細胞與IGListKit,由具有部分的靜態和動態的項目有點掙扎。我正在考慮創建三個IGListCollectionView並在它們之間設置底部/頂部約束,但我對這樣做的可能性有一些懷疑。

我想知道,如果有人碰到類似的問題已經來到和/或如果從IGListKit的傢伙可以給我一個什麼樣的解決,最好執行一些提示?

回答

0

你應該回到你的區間控制器對每個對象的唯一實例。不要重複使用它們!

另一個要注意的是,你使用self作爲DIFF標識,這意味着該對象的實例標識它的獨特性。這意味着兩個DataSource對象不會被比較(obj.items.count == items.count將永遠不會發生)。不是一個破壞交易的行爲,但要意識到這是它的行爲。

您也可能想看看IGListBindingSectionController,它將採用您的原始模型並將其分解爲視圖模型,以驅動該部分中的每個單元格。

更多細節及在拉請求的示例。請注意,如果您使用CocoaPods,則需要使用主人。

https://github.com/Instagram/IGListKit/pull/494