2015-05-02 21 views
5

Zanim jeszcze zacznę zadawać moje pytanie, chciałbym dodać małą notatkę - Nie proszę o kod. Chcę wyraźnie stwierdzić, że teraz, ponieważ niektórzy mogą postrzegać to pytanie jako żądanie kodu. Pytam o pomysły na JAK to osiągnąć, nie chcę, aby ktoś inny zrobił to za mnie.Sortowanie elementów za pomocą NSDate i dodawanie do UITableView

Niedawno dostałem się do Core Data, a ja doświadczam jednego wyjątkowego problemu, że mam poważne problemy w rozwiązywaniu. Mam kilka obiektów podklasy NSManagedObject i mają trzy właściwości, z których jedna jest związana z tą sytuacją - należnaData, która jest typu NSDate. pracuję znaleźć sposób sortowania obiektów instacji, a następnie dodać potem do jednej z pięciu różnych sekcji w UITableView, które obejmują:

  1. Today
  2. Jutro
  3. One Week
  4. Miesiąc
  5. dłużej niż jeden miesiąc

sortowanie elementów współpracuje z tej funkcji:

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)") 
    } 

} 

Obecnie funkcja ta nie wykorzystuje mojego obiektu podklasy, ale to nie powinno mieć żadnego wpływu innego niż potrzeba do oddania wartość jako NSDate obiektu.

Moje pytanie brzmi: jak mogę wstawić te obiekty do UITableView. Rozumiem, że to dość szerokie pytanie, ale szczerze mówiąc nie wiem, co jeszcze mogę zrobić. Próbowałem używać wielu tablic, po jednej dla każdej kategorii, ale to nie zadziałało dobrze - jeśli jedna z tablic jest pusta, pojawiają się problemy. W jaki sposób mogę posortować te obiekty, aby mogły zostać usunięte i usunięte raz w UITableView?

+0

Ten kod wygląda znajomo :) –

+0

Oto przykładowy projekt firmy Apple demonstrujący sposób grupowania widoku tabeli na sekcje na podstawie daty: https://developer.apple.com/library/ios/samplecode/DateSectionTitles/ Wprowadzenie/Intro.html.I tutaj jest podobne pytanie (w Objective-C): http://stackoverflow.com/questions/20249098/how-to-implement-table-sections-with-core-data. –

+0

@MartinR To mi dobrze służyłem, debatowałem, czy powinienem połączyć moje pytanie CodeReview, ale zdecydowałem się odrzucić. : P Zajrzę do projektu Apple'a i tego, co powiedział Wain, bardzo dziękuję za dalszą pomoc. – Jeffrey

Odpowiedz

2

Postaram się trochę przesunąć twoją logikę i użyć kontrolera wyników, by poradzić sobie z sekcją.

Aby użyć pobranego kontrolera wyników, utwórz pobranie i dodaj deskryptor sortowania według daty. Będzie to zwykła lista, na którą możesz najpierw pracować.

Następnie dodaj do twojej podklasy własność przejściową i tam powinieneś zwrócić ciąg znaków, dla którego sekcji należy obiekt (wynik może być buforowany, więc nie przeliczasz go przez cały czas). Ustaw nazwę tej przejściowej właściwości jako ścieżkę klucza nazwy sekcji na kontrolerze FRC.

+1

Przejściowa właściwość identyfikatora sekcji prawdopodobnie nie zwróci bezpośrednio nazwy sekcji ("Dzisiaj", "Jutro", ...), ponieważ nie będzie to poprawnie sortowane. [Tutaj] (http://stackoverflow.com/a/20249349/1187415) Zasugerowałem użycie zamiast tego liczby (która jest tłumaczona na "prawdziwą" nazwę sekcji w tytuleForHeaderInSection). –

1

Polecam zajrzeć do klasy NSFetchedResultsController. Jest specjalnie zaprojektowany do wyświetlania danych podstawowych w widoku tabeli.

NSFetchedResultsController

Możesz dodać deskryptory sortowania, który będzie na bieżąco sortowane i zorganizowane i wspiera przesuń w lewo, aby usunąć funkcje. Wykonuje wiele trudnych zadań, jeśli chodzi o zarządzanie danymi podstawowymi w widoku tabeli.

Powiązane problemy