2016-03-20 7 views
2

Ich bin ein Anfänger in Swift und habe es geschafft, zumindest die Grundlagen zu verstehen, wie man ein UITableView auffüllt. Ich stecke jetzt daran, mehrere Abschnitte mit Daten aus einem Wörterbuch zu füllen.Swift - Populating TableViews mit mehreren Abschnitten aus multidimensionalem Array

Ich habe ein mehrdimensionales Wörterbuch, die Objekte zu Kategorien zuordnet:

var categoryDict:[String:[AnyObject]] = ["Category A": ["Object 1","Object 2"], "Category B":["Object 3"]] 

Jetzt möchte ich bevölkern meine Tableview, so dass es so etwas wie dies zeigt:

  • Kategorie A

    • Objekt 1
    • Objekt 2
  • Kategorie B

    • Objekt 3

So weit ich bin in der Lage eine Reihe von Kategorien zu erstellen, um die Anzahl von Abschnitten zurückzukehren sowie die Arrays zu zählen im Wörterbuch gespeichert, um die Anzahl der Zeilen in jeder bestimmten Kategorie zu erhalten. Jetzt bin ich völlig beim Auffüllen des TableView mit Abschnitten und Zeilen fest. Wie kann ich das machen? Vielen Dank!

Mein Code so weit:

var categoryList:[String] = [String]() 
var categoryDict:[String:[AnyObject]] = ["Category A": ["Object 1","Object 2"], "Category B":["Object 3"]] 


func getLists() { 
    categoryList = Array(categoryDict.keys) 
    categoryList.sortInPlace(before) 
} 

// Sort Array 
func before(value1: String, value2: String) -> Bool { 
    return value1 < value2; 
} 

func getNumberOfEntrysInSection (Section: Int) -> Int { 

    let category:String = categoryList[Section] //Get Category for Index in CategoryList 

    let value:[AnyObject] = categoryDict[category]! //Get Value for this specific Category 

    let number = value.count 

    return number 
} 


// MARK: - Table view data source 

override func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
    getLists() 
    return categoryList.count 
} 


override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return getNumberOfEntrysInSection(section) 
} 


override func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? { 
    return categoryList[section] 
} 


override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 

    let cell = tableView.dequeueReusableCellWithIdentifier("BufferCell", forIndexPath: indexPath) 

    ??? 
    return cell 
} 
+0

Haben Sie Ihren Delegierten und Ihre Datenquelle festgelegt? – ridvankucuk

+0

Ich denke du bist auf dem richtigen Weg. Was ist dein Problem, Bruder? – iMuzahid

+0

Ich denke, Delegat und Datenquelle sind richtig eingestellt - ich kann eine Tabelle mit nur einem Abschnitt auffüllen, aber mehrere Abschnitte sind das Problem: Ich kann keinen Weg finden zu sagen "Lassen Sie den Titel für Abschnitt 0 der String in der KategorieListe bei a Spezifischer Index, befüllen Sie dann die Zellen innerhalb dieses Abschnitts mit den Werten, die in categoryDict für diese bestimmte Kategorie angegeben sind ". Weißt du was ich meine? All die Tutorials, die ich gelesen habe, scheinen das auf eine andere Art und Weise zu tun (was ich nicht wirklich verstehe), aber es muss eine Möglichkeit geben, die Daten einzufügen, wenn ich sie aus dem Kategorie-Wörterbuch heraus gebe. – Eirikurii

Antwort

2

Zunächst einmal: Ein Wörterbuch ist eine schlechte Wahl Tabellenansicht Inhalte zu speichern. Wörterbücher sind von Natur aus ungeordnet, Sie müssen also die Schlüssel sortieren. Wenn Ihre Daten über eine kleine Anzahl von Elementen hinausgehen, benötigt der Sortierprozess beträchtliche Zeit.

Wenn Sie ein Wörterbuch trotzdem verwenden, sollten Sie Ihren Code neu gestalten, so dass Sie die sortierten Schlüssel behalten und sie immer wieder verwenden, es sei denn, das Wörterbuch ändert sich. Ich würde es so machen, dass Sie eine Setter-Methode zum Wörterbuch hinzufügen und immer diesen Setter verwenden, um das Wörterbuch zu ändern. Die Setter-Methode würde die sortierten Schlüssel neu generieren. Auf diese Weise müssen Sie die Schlüssel nur sortieren, wenn sich das Wörterbuch ändert. (Aber besser, um das Wörterbuch vollständig loszuwerden.)

Ich würde vorschlagen, ein Section Objekt zu erstellen, das ein sectionTitle String und ein sectionEntries Array enthält. Machen Sie dann die Daten der Tabellenansicht zu einem Array von Section-Objekten.

Da Sie jedoch ein Wörterbuch haben, zeige ich Ihnen, wie Sie diesen Code arbeiten lassen.

Sie benötigen Hilfe mit Ihrer cellForRowAtIndexPath Methode. Du bist fast am Ziel. Sie müssen nur den entsprechenden Eintrag in Ihrer Datenstruktur mithilfe des Abschnitts und der Zeile indexPath abrufen. Etwas wie dieses:

override func tableView(tableView: UITableView, 
    cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
{ 

    let cell = tableView.dequeueReusableCellWithIdentifier("BufferCell", 
    forIndexPath: indexPath) 
    let section = indexPath.section 
    let row = indexPath.row 

    let categoryKey:String = categoryList[section] 
    let aCategoryEntry:[String] = categoryDict[category]! 
    let anObject = aCategoryEntry[row] // 
    let cell.textLabel.text = anObject 
    return cell 
} 
+0

Genau das, was ich gesucht habe - vielen Dank !! Der Grund, warum ich Wörterbücher verwende, um die Daten zu speichern, ist einfach, dass ich vorerst verstehe, was ich mache, wenn ich sie benutze. Effizienz und Datenspeicherung sind der nächste Schritt auf meiner Learning-Swift-to-do-Liste, aber im Moment bin ich glücklich, dass ich meine Daten überhaupt speichern kann. Also nochmal: Danke! – Eirikurii

+0

Wenn Sie den Code, den Sie in Ihrer ursprünglichen Frage gepostet haben, selbst geschrieben haben, dann sind Sie 90% des Weges dorthin. Du hast gerade das "große Bild" verloren, bevor du den letzten Schritt gehen konntest. –

Verwandte Themen