Hier zu wiederholen ist mein Dilemma, Refactoring ich meinen Code, NSFetchedResultsController zu verwenden, möchte ich hart Code a Satz von 5 Abschnitten, die ich immer anzeigen möchte, unabhängig davon, ob Zeilen darin enthalten sind oder nicht. Ich bin ein bisschen erfolgreich darin, sie zum Vorschein zu bringen, aber leider kann ich nicht die richtigen Zeilen finden, um unter den richtigen Abschnitten zu erscheinen. (Anmerkung: Ich bin mit einem benutzerdefinierten Header mit einer Schaltfläche, die Reihe der hinzufügt, wenn der Benutzer eine Zelle auf einen bestimmten Abschnitt hinzufügen möge.) Die Modellbeziehung in Coredata ist, dass ein Hund Modell viel Aufgabe den haben kann, sondern eine Aufgabe kann nur haben ein Hund. Leider scheint ich alle Aufgaben für jeden einzigartigen "Hund", den ich erschaffe, zu holen, so dass sie alle dieselben Informationen haben.Mit NSFetchedResultsController, wie kann ich programmgesteuert 5 Abschnitte zu zeigen sowie filtern, um die entsprechenden Zeilen
Hier ist mein Task-Modell und die Enumeration, die ich verwende, um die 5 Abschnitte in der NSFetchedResultsController zu erstellen.
Hier ist mein FetchedResultsController, wo ich den Enum-Typ als sectionNameKeyPath übergeben.
class TaskController {
static let sharedController = TaskController()
private let kTask = "Task"
var fetchedResultsController: NSFetchedResultsController
var dog: Dog?
init() {
let request = NSFetchRequest(entityName: kTask)
let sortDescriptor1 = NSSortDescriptor(key: "type", ascending: true)
request.sortDescriptors = [sortDescriptor1]
fetchedResultsController = NSFetchedResultsController(fetchRequest: request, managedObjectContext: Stack.sharedStack.managedObjectContext, sectionNameKeyPath: String(Type), cacheName: nil)
_ = try? fetchedResultsController.performFetch()
}
}
Im numberOfRowsInSection versuche ich den sections.count übereinstimmen Abschnitt zu der der Funktion Eigenschaft gleich zu sein, wie ich die fetchedResultsController Abschnitt gehe davon tatsächlich nicht existiert, bis eine Zeile erstellt wird? Um ehrlich zu sein, bin ich an diesem Punkt verloren, da ich nicht sicher bin, wie ich die richtigen Zeilen holen soll, um den passenden Abschnitten zu entsprechen. Der kommentierte Code war, wie ich anfänglich die richtigen Zeilen für die richtigen Abschnitte abgerufen habe, bevor ich meinen Code umstrukturierte und ihn auf den NSFetchedResultsController-Weg aktualisierte.
extension DogDetailViewController: UITableViewDataSource {
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
guard let sections = TaskController.sharedController.fetchedResultsController.sections else { return 0 }
if sections.count > 0 && section < sections.count {
return sections[section].numberOfObjects
}
return 0
// }
// if let dog = self.dog {
// switch section {
// case 0:
// return dog.tasks.filter({$0.type == String(Type.Meals)}).count
// case 1:
// return dog.tasks.filter({$0.type == String(Type.Exercise)}).count
// case 2:
// return dog.tasks.filter({$0.type == String(Type.Health)}).count
// case 3:
// return dog.tasks.filter({$0.type == String(Type.Training)}).count
// case 4:
// return dog.tasks.filter({$0.type == String(Type.Misc)}).count
// default:
// return 0
// }
// } else {
// return 0
// }
}
Jede Hilfe wird geschätzt, Danke!
Dank @Charles A., wird heute Abend eine Aufnahme später geben. Es ist interessant, dass Sie jedem Element im Array Sections eine eigene Variablenzuordnung von NSFetchedResultsController gaben. Ich nahm einfach an, dass ich nur einen Haupt-NSFetchedResultsController brauchte, den ich einfach für die Information filtern würde, die ich wollte? –
Wenn Sie den Abschnitt komplett weglassen wollten, wenn eine Aufgabe für einen bestimmten Typ nicht existierte, würde ich eine 'NSFetchedResultsController' verwenden, die Einschränkung für' type' im 'NSPredate' weglassen und sie stattdessen in Abschnitte mit dem' sectionNameKeyPath aufteilen '. Angesichts der Tatsache, dass Sie immer die Abschnitte wollen, halte ich das für einen einfacheren Ansatz. Im Idealfall möchten Sie die Filterung in der DB-Engine mit einem Prädikat durchführen, wenn dies sinnvoll ist und nicht im Speicher. –