2017-03-09 1 views
0

Ich versuche, eine Sammlungsansicht mit IGListKit zu implementieren. Es kann entweder einen oder drei Abschnitte haben. Die Datenquelle wird in Echtzeit ausgefüllt und muss daher den Inhalt aktualisieren, wenn neue Daten verfügbar sind.IGListKit mit Abschnitten und mehreren Elementen

so zu tun, ich habe ein Datasource-Objekt erstellt IGListDiffable entspricht, die jeden Abschnitt als solche darstellen:

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 
    } 
} 

In jedem Abschnitt, würde ich eine Liste von items angezeigt werden mag. Ich habe es geschafft, den Abschnitt zu erstellen, indem ich den gleichen Abschnitt-Controller wiederverwendete, aber die einzige Möglichkeit, ein neues Ergebnis einzufügen, war, auf dem Adapter reloadData() aufzurufen. Das ist ziemlich schlecht, da es die komplette Liste der Elemente (die möglicherweise sehr lang sein können,> 50 Elemente) neu lädt. Es gibt auch keine Möglichkeit, das Einfügen neuer Artikel zu animieren. Ich habe auch versucht, eine adapter.performUpdates(animated: true) ohne Glück zu tun, wie es nur meine Datenquelle aber nicht die Einzelteile innerhalb der Datenquelle erneuern.

Ich habe dann versucht, einen Abschnitt Controller erstellen, die jeden Abschnitt mit einer Zelle anzeigen wird. Die Zelle würde eine IGListCollectionView enthalten und würde sich um die Anzeige der items kümmern, aber damit hatte ich kein Glück, und obwohl der zweite Abschnitt Controller die Objekte empfängt, zeigt er nie die Zellen an.

Ich bin ein bisschen kämpfen jetzt und nicht sicher, wie ich drei verschiedene Abschnitte anzeigen könnte, die den gleichen Typ von Zellen mit IGListKit verwenden, indem Sie die Abschnitte statisch und die Elemente dynamisch haben. Ich denke darüber nach, drei IGListCollectionView zu erstellen und bottom/top constraints zwischen ihnen einzurichten, aber ich habe einige Zweifel an der Möglichkeit, das zu tun.

Ich frage mich, ob jemand schon auf ein ähnliches Problem gestoßen ist und/oder ob die Jungs von IGListKit mir ein paar Tipps geben könnten, was die beste Implementierung ist, um das zu lösen?

Antwort

0

Sie sollten eindeutige Instanzen Ihrer Abschnittscontroller für jedes Objekt zurückgeben. Benutze sie nicht wieder!

Eine andere Sache zu beachten ist, dass Sie self als die diff-Kennung verwenden, was bedeutet, dass die Instanz des Objekts seine Eindeutigkeit identifiziert. Das bedeutet, dass zwei DataSource Objekte nie verglichen werden (obj.items.count == items.count wird nie passieren). Kein Deal-Breaker, aber sei dir bewusst, dass es sich so verhält.

Sie können auch einen Blick auf IGListBindingSectionController werfen, die Ihr Originalmodell aufnimmt und es in Ansichtsmodelle unterteilt, die jede Zelle in diesem Abschnitt steuern.

Weitere Details und ein Beispiel in der Pull-Anforderung. Beachten Sie, dass dies die Verwendung von Master erfordert, wenn Sie CocoaPods verwenden.

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

Verwandte Themen