2017-02-27 3 views
0

Ich versuche, eine TabelleCell in den entsprechenden Abschnitt in meinem TableView hinzuzufügen. Ich habe eine Liste von Clients, die als solche indiziert werden:Einfügen einer TableCell in den richtigen Abschnitt

var clients = Client.loadAllClients()  //Returns client array 
var contacts = [String: [Client]]() 
var letters: [String] = []  

Wenn ich meine Indizierung, die Kontakte Wörterbuch Rückkehr:

{A: [Client("Andrew")]} 

Letters Array zurück:

[A] 

Was ich Verwenden Sie dann, um die gesamte Liste der Clients zu indizieren und sie in die richtigen Abschnitte mit Abschnittsüberschriften einzufügen. Das alles funktioniert gut. Ich bin jedoch verwirrt darüber, wie ein neuer Client in diese indizierte Tabelle hinzugefügt wird, so dass der Name des Clients mit der richtigen Abschnittsüberschrift übereinstimmt.

Ich verwende die Vorbereitung Funktion, um das neu erstellte Client-Objekt zurück an den TableViewController zu übergeben und dann an das Client-Array anzuhängen. Ich weiß, dass das Array die Informationen enthält, aber ich kann die Zelle nicht in der Tabelle anzeigen. Durch einige Forschung, die ich mit diesem gekommen sind:

@IBAction func addNewClient(segue:UIStoryboardSegue) { 
    let newClient = addNewClientData() 
    let firstLetter = charToString(c: [getFirstLetter(s: newClient.lName)]).capitalized 
    if !letters.contains(firstLetter) { 
     letters.append(firstLetter) 
     contacts[firstLetter] = [Client]() 
     letters.sort() 
    } 
    let sectionIndex = Int(letters.index(of: firstLetter)!) 
    self.tableView.beginUpdates() 
    self.tableView.insertRows(at: [IndexPath(row: contacts[firstLetter]!.count - 1, section: sectionIndex)], with: .automatic) 
    self.tableView.endUpdates() 
    contacts[firstLetter]!.append(newClient) 

} 

Diese Funktion wird ausgeführt, wenn die Schaltfläche „Speichern“ auf einer anderen Ansicht gedrückt wird. Ich habe das Objekt, ich bin verwirrt, wie man es in den richtigen Index und Abschnitt in der Tabelle einfügt. Ich erhalte eine ungültige Anzahl von Abschnitten, wenn ich das ausführe. Ich benutze xCode 8.0 und Swift 3.0. Wenn ich weitere Informationen geben muss, lass es mich wissen. Vielen Dank.

+0

• das erste Zeichen des Kunden Get • den Index des Zeichens Get in 'Buchstaben' (das ist der Abschnitt) • Wenn der Index nicht existiert, fügen Sie das Zeichen in' Buchstaben' ein und fügen Sie ein Schlüssel-Wert-Paar 'contacts [" "] = [Client]()' in 'Kontakte' hinzu • Anhängen der Client im Client-Array des entsprechenden Zeichens (das ist die Zeile). • Aktualisieren Sie 'Kontakte', indem Sie das Array zurück zuweisen. – vadian

+0

Können Sie bitte die letzten Punkte noch genauer erläutern? Bisher habe ich das: 'index = letters.index (of: firstLetter)! clientIndex = contacts [lName [lName.startIndex]] ?. count' Der Index ist für den "section" und der clientIndex für "row" – brandenk

+0

Der IndexPath, den du in 'insertRows' übergibst, sieht für mich wirklich seltsam aus. Wenn Sie 10 Kontakte im Array haben und einen 11. Kontakt einfügen, möchten Sie in Zeile 10, Abschnitt 11 einfügen? Was erscheint in den Zeilen 0-10 in Abschnitt 11? –

Antwort

0

Ich habe die Antwort auf diese Frage gefunden, indem ich eine andere Frage gestellt habe. Das Problem mit meinem Wörterbuch war, dass es ein Wörterbuch war. Während Wörterbücher für Indexierung und Tabellen funktionieren, sind Arrays für Swift und Xcode optimiert. Die Lösung bestand darin, eine Datenstruktur zu erstellen, die als Array funktioniert. Unten ist der Link für die Datenstruktur zur Lösung:

Filtering an Array inside a Dictionary - Swift

nun einen neuen Kunden einzufügen:

let newClient = Client(lName: cLast) 
    let firstLetter = newClient.getFirstLetter(s: cLast).capitalized 
    for contact in contacts { 
     if firstLetter == contact.letter { 
      contact.add(client: newClient) 
     } else { 
      let tempContact = Contact(letter: firstLetter, clients: [newClient]) 
      contacts.append(tempContact) 
      break 
     } 
    } 
    indexClients() 
    self.tableView.reloadData() 
Verwandte Themen