2017-12-19 6 views
-2

So in meiner App können Benutzer Ausgaben erstellen und speichern und sie pro Monat anzeigen. Momentan erscheinen alle meine Ausgaben in der Reihenfolge, in der ich sie hinzufüge, aber ich möchte, dass sie in der Reihenfolge der Daten erscheinen, und ich möchte auch einen Tabellenkalkulator mit den Daten haben, damit die Ausgaben zusammen gruppiert werden. Ich habe diesen Code in meinem ViewdidLoad ausprobiert.So sortieren Sie Elemente nach Datum in der Tabellenansicht Swift 3

for expense in monthlyExpenses{ 
     if let dateString = expense.modificationDate?.convertToString(){ 
     let dateFormatter = DateFormatter() 
     dateFormatter.dateStyle = DateFormatter.Style.medium 
     dateFormatter.timeStyle = DateFormatter.Style.none 
     let finalDate = dateFormatter.date(from: dateString) 
     if let finalDate = finalDate{ 
      let dateString2 = finalDate.timeIntervalSinceReferenceDate 
      if self.toDoList[dateString2] == nil { 
       self.toDoList[dateString2] = [expense.name!] 
      } 
      else { 
       self.toDoList[dateString2]?.append(expense.name!) 
      } 
     } 
    } 
    } 

und dann versucht, diesen Code in meinem tableviewheader Abschnitt jedoch einen EXC_BAD_INSTRUCTION Fehler.

func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? { 

    let dateDouble = self.sortedSections[section] 

    let date = Date(timeIntervalSinceReferenceDate: dateDouble) 

    let dateformatter = DateFormatter() 

    dateformatter.dateStyle = DateFormatter.Style.medium 

    dateformatter.timeStyle = DateFormatter.Style.none 

    return dateformatter.string(from: date) 

} 

Jeder Aufwand ist ein individuelles Objekt, das in Kerndaten gespeichert sind, und verfügt über Eigenschaften wie Name, Menge, Änderungsdatum usw. ich sie möchte durch Änderung Datum sortiert werden. Wie werde ich das machen?

Antwort

0

Ich habe etwas ähnliches getan, aber ich benutze eine Bibliothek, die bereits Xib und Methoden hat, alles einzustellen. Hier ist nur eine kleine Hilfe von meiner Seite.

Sie können eine xib vorbereiten, um Daten und Daten in tableView anzuzeigen. Hier können Sie die Zeile ausblenden, wenn das nächste Datum dem vorherigen Datum entspricht, und wenn das Datum sich ändert. Daten Um zu zeigen, Termine nach Ihnen so etwas tun kann (Wenn Daten nach Daten hinzugefügt wird)

let expenses = [ExpensesClass]() 

// in `cellForItemAt indexPath` 

let expense = expenses[indexPath.row] 
    let date = expense.date 
    let dateFormatter = DateFormatter() 
    dateFormatter.dateFormat = "MMMM d, yyyy" 
    let dateString = dateFormatter.string(from: date! as Date) 

. . . . . . 

if indexPath.row > 0 { 
     let previousExpensesData = expenses[indexPath.row - 1].date 
     let day = Calendar.current.component(.day, from: expense.date) // Do not add above 'date' value here, you might get some garbage value. I know the code is redundant. You can adjust that. 
     let previousDay = Calendar.current.component(.day, from: expenses[indexPath.row - 1].date) 
      if day == previousDay { 
       cell.dateTitle.text = "" 
      } else { 
        cell.dateTitle.text = dateString 
      } 
    }else{ 
     cell.dateTitle.text = dateString 
     print("Cannot return previous Message Index...\n\n") 
    } 

Sie Höhe in diesem Verfahren einstellen kann ->func tableView(UITableView, heightForRowAt: IndexPath).

Ich bin nicht sicher über diese Methode ->func tableView(UITableView, titleForHeaderInSection: Int). Sie können es in diesem Verfahren versuchen, auch wenn die oben genannten man nicht für Sie arbeiten und die Höhe entsprechend anpassen in ->func tableView(UITableView, titleForHeaderInSection: Int)

func tableView(_ tableView: UITableView, 
    heightForRowAt indexPath: IndexPath) -> CGFloat 
{ 
    let expense = expenses[indexPath.row] 

    if indexPath.row > 0{ 
     let day = Calendar.current.component(.day, from: expense.date) 
     let previousDay = Calendar.current.component(.day, from: expense[indexPath.row - 1].date) 
     if day == previousDay { 
      return 0.0 
     }else{ 
      return 20.0 
     } 
    } 
    return 20.0 
} 
+0

Ehrfürchtig Denken! Das war wirklich schlau, dachte nie, dass man es so machen könnte, anstatt Schnitte einzuführen, nur ein Etikett dafür zu erstellen. Danke, ich habe das stundenlang versucht !! –

+0

@AG Hey ... Ich bin so froh, dass es geholfen hat ... Danke ... Viel Glück :-) – Bella

0

1. ein Wörterbuch erstellen, das Datum als Schlüssel und Array enthält von Aufträge modifiziert oder als Wert aufgelegt.

var orderDictionary [Datum: [Ordnung]] = [:]

for order in yourOrders { 

    var orders = orderDictionary[order.modificationDate] ?? [] 

    if orders.count == 0 { 
    orderDictionary[order.modificationDate] = [order] 
    } else { 
    orders.append(order) 
    orderDictionary[order.modificationDate] = orders 
    } 
} 

2. Sortierschlüssel Array von Wörterbuch.

let dateArray = orderDictionary.keys

dateArray.sort { $0 < $1 }

ändern Vergleichsbedingung auf der Grundlage Ihrer Anforderung wie, ob Sie es in auf- wollen oder in absteigender Reihenfolge.

3. In func tableView(UITableView, titleForHeaderInSection: Int) Schreib

return dateArray[section] oder Format Datum, wie Sie wollen.

4. In numberOfRowsForSection schreiben

return orderDictionary[dateArray[section]].count

5.In cellForRowAtIndexPath schreiben

let order = orderDictionary[dateArray[indexPath.section]][indexPath.row]

+0

Danke für die Lösung, aber ich bekomme immer einen Fehler, dass seit Bestellungen ein Let, es ist nicht änderbar und damit Sie kann nichts anhängen. –

+0

Was ist mit der Funktion numberOfRowsInSection? –

+0

@ A.G Ich habe die Antwort aktualisiert nach Ihrem Kommentar überprüfen Sie es. – MARTIN

Verwandte Themen