2015-05-02 11 views
5

Prima ancora di iniziare a porre la mia domanda, vorrei aggiungere una piccola nota - Non sto chiedendo il codice. Desidero dichiararlo esplicitamente adesso, poiché alcuni potrebbero percepire questa domanda come una richiesta di codice. Sto chiedendo idee su COME per raggiungere questo obiettivo, non voglio che qualcun altro lo faccia per me.Ordina elementi tramite NSDate e aggiungi a UITableView

Recentemente, sono entrato in Core Data, e ho riscontrato un problema univoco che ho problemi di risoluzione. Ho alcuni oggetti sottoclasse NSManagedObject e hanno tre proprietà, una delle quali è rilevante per questa situazione - dueDate, che è del tipo NSDate. Ho lavorato per trovare un modo per ordinare gli oggetti sottoclasse, e quindi aggiungere poi in uno dei cinque diverse sezioni del UITableView, che comprendono:

  1. Oggi
  2. Domani
  3. Una settimana
  4. Un mese
  5. più di un mese

Ordinamento degli elementi lavora con questa funzione:

func fetchAssignments() { 
    let appDelegate = 
    UIApplication.sharedApplication().delegate as! AppDelegate 

    let managedContext = appDelegate.managedObjectContext! 

    let fetchRequest = NSFetchRequest(entityName:"Assignment") 

    var error: NSError? 

    let fetchedResults = 
    managedContext.executeFetchRequest(fetchRequest, 
     error: &error) as! [NSManagedObject]? 

    if let results = fetchedResults { 
     let calendar: NSCalendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)! 
     let todayDate = calendar.startOfDayForDate(NSDate()) 

     for item in results { 
      let dueDate = item.valueForKey("dueDate") as! NSDate 
      println(dueDate) 
      let calendarComponents = calendar.components(.CalendarUnitYear | .CalendarUnitMonth | .CalendarUnitDay, 
       fromDate: todayDate, toDate: dueDate, options: nil) 

      println("Months: " + calendarComponents.month.description) 
      println("Days: " + calendarComponents.day.description) 

      if calendarComponents.month >= 2 || (calendarComponents.month == 1 && calendarComponents.day > 0) { 
       println("Greater") 
      } else if calendarComponents.month == 1 || calendarComponents.day > 7 { 
       println("One Month") 
      } else if calendarComponents.day > 1 { 
       println("One Week") 
      } else if calendarComponents.day == 1 { 
       println("Tomorrow") 
      } else { 
       println("Today") 
      } 
     } 

     println() 
     tableView.reloadData() 

    } else { 
     println("Could not fetch \(error), \(error!.userInfo)") 
    } 

} 

Attualmente, questa funzione non utilizzare il mio scopo sottoclassi, ma che non dovrebbe avere alcun effetto diverso da quello della necessità di lanciare il valore come un oggetto NSDate.

La mia domanda è, come posso inserire questi oggetti nel UITableView. Capisco che questa è una domanda abbastanza ampia, ma onestamente non so cos'altro fare. Ho provato a utilizzare più array, uno per ogni categoria, ma non ha funzionato bene - se uno degli array è vuoto, sorgono problemi. Come posso ordinare questi oggetti in modo che possano essere inseriti e eliminati una volta nello UITableView?

+0

Questo codice sembra familiare :) –

+0

Ecco un esempio di progetto da Apple che dimostra come raggruppare una vista tabella in sezioni basate sulla data: https://developer.apple.com/library/ios/samplecode/DateSectionTitles/ Introduzione/intro.html.Ed ecco una domanda simile (in Objective-C): http://stackoverflow.com/questions/20249098/how-to-implement-table-sections-with-core-data. –

+0

@ MartinR Mi è servito bene, stavo discutendo se dovevo collegare la mia domanda CodeReview ma ho deciso contro. : P Analizzerò il progetto di Apple e quello che Wain ha detto, grazie mille per il continuo aiuto. – Jeffrey

risposta

2

Guarderei spostando la logica un po 'e usando un controller di risultati recuperato per gestire il sezionamento.

Per utilizzare un controller dei risultati recuperato, creare un recupero e aggiungere un descrittore di ordinamento per data. Questo sarà un elenco semplice che puoi iniziare per primo.

Quindi, aggiungi una proprietà temporanea alla sottoclasse e lì dovresti restituire la stringa per la sezione a cui appartiene l'oggetto (il risultato può essere memorizzato nella cache in modo da non ricalcolarlo tutto il tempo). Impostare il nome di questa proprietà temporanea come percorso chiave del nome della sezione sul FRC.

+1

La proprietà temporanea per l'identificatore di sezione probabilmente non può restituire direttamente il nome della sezione ("Oggi", "Domani", ...) perché non sarebbe stato ordinato correttamente. [Qui] (http://stackoverflow.com/a/20249349/1187415) Ho suggerito di usare un numero invece (che è tradotto nel nome della sezione "reale" in titleForHeaderInSection). –

1

Si consiglia di esaminare la classe NSFetchedResultsController. È specificamente progettato per visualizzare i dati di base in una tableview.

NSFetchedResultsController

È possibile aggiungere descrittori di ordinamento, che manterrà il vostro ordinato e organizzato e sostiene il colpo a sinistra per eliminare le funzioni. Quando si tratta di gestire i dati di base in una vista tabella, è molto importante per voi.

Problemi correlati