2017-07-02 5 views
1

Ich habe Probleme beim Übergeben von Daten aus meinem Modell an eine Sammlungsansicht. Ich habe meinen Code auf ein einfaches Projekt vereinfacht das Problem zu veranschaulichen, die hier verfügbar ist: https://github.com/routineCode/collectionViewDataProblemÜbergabe von Daten an collectionView (numberOfItemsInSection) -Funktion (Swift)

Hier wird ein Bild, das gewünschte Ergebnis und tatsächliche Ergebnis mit dem aktuellen Code zeigt: View Controller output showing Desired vs. Actual Result

Ich möchte Die Funktion collectionView (numberOfItemsInSection) gibt die Anzahl der Elemente (5) in meinem Array [data] zurück, gibt aber stattdessen den fest codierten Wert zurück (3). Durch das Debuggen wird mir klar, dass dies darauf zurückzuführen ist, dass viewController immer Null ist, wenn diese Funktion aufgerufen wird, aber ich verstehe nicht, wie ich das Problem umgehen kann. Ich verwende auch das [Daten] -Array in der collectionView (cellForItemAt) -Funktion, und das funktioniert gut, weil ViewController zum Zeitpunkt des Aufrufs der Funktion nicht null ist. Danke für jede Hilfe.

Antwort

0

zu reload Versuchen Sie, nachdem Sie die Viewcontroller gesetzt

lazy var menuBar: MenuBar = { 
    let mb = MenuBar() 
    mb.viewController = self 
    mb.cView.reloadData() 
    return mb 
    }() 

By the way, Ihr Code hat Problem mit dem Gedächtnis

Kreis

beibehalten Kreis ist, wenn zwei Objekte stark beibehalten Leck Bezug zueinander, so dass sich niemand entschließt. Here ist ein Beispiel für beibehalten Kreise genau das gleiche wie Ihres ist.

in Ihrem Code die Viewcontroller hat eine starke Referenz

lazy var menuBar: MenuBar ... 

Und MenuBar hat einen starken Bezug auf Viewcontroller

var viewController: ViewController? 

Sie auf menuBar die Viewcontroller Eigenschaft zu schwach eingestellt, aber was für Sie gib den ganzen ViewController? Warum sollte Ihre Menüleiste über den gesamten ViewController bekannt sein? Sie können einfach die ViewController-Eigenschaft entfernen und stattdessen eine Dateneigenschaft angeben.

let data = [String]() 

und legen Sie es in Ihrem Viewcontroller

lazy var menuBar: MenuBar = { 
    let mb = MenuBar() 
    mb.data = data 
    return mb 
    }() 
+0

Ihr Vorschlag die Linie mb.cView.reloadData() gearbeitet hinzuzufügen. Vielen Dank. –

+0

In Bezug auf Ihre zusätzlichen Kommentare: Ich habe nur genug Code gepostet, um das Problem zu zeigen. In meinem ursprünglichen Code gibt es einen Funktionsaufruf wie diese viewController.scrollToMenuIndex (indexPath.item) Die einzige andere Möglichkeit, wie ich einen solchen Aufruf machen kann, ist die Verwendung einer statischen Funktion, aber als ich versuchte, hatte ich Probleme, es zum Funktionieren zu bringen . Daher nahm ich Ihren Vorschlag, um schwache var ViewController in der MenuBar-Klasse zu verwenden. Danke noch einmal. –

Verwandte Themen