UITableView 错误的部分标题

Emp*_*ess 0 core-data uitableview nsfetchedresultscontroller ios

我已经被这个错误困扰已经有一段时间了。我有一个UITabBar有 2 个选项卡的。第一个包含UITableViewController一周中不同日期的餐食。第二个选项卡包含一个UIViewController登录屏幕。

UITableViewController被称为“EettafelView”。它从在线来源获取食物(使用 Alamofire)并将其呈现在应用程序中。它们被缓存CoreData并使用 aNSFetchedResultsController来检索以呈现它们。为此,我使用默认值UITableViewDelegates(numberOfRowsInSection、numberOfSections 等)-如果它们相关,我会将它们发布在编辑中。

当 tableview 加载并且我设置了 fetchController 并执行了 fetch 时,我漂亮地打印它的对象以测试它保存的内容以及排序描述符是否完成了它们的工作。这导致以下结果:

Hollandse stoof met bokbier - Optional("maandag, 20 feb.")
    Gehaktballetjes
    Quorn gehakt
Stamppot van verse spinazie - Optional("dinsdag, 21 feb.")
    Rookworst
    Kaasspies
Indiase Curry - Optional("woensdag, 22 feb.")
    Kip
    Bloemkool
Pasta Mexicane - Optional("donderdag, 23 feb.")
    Gehakt
    Tofu en Bruine Bonen
Boeuf des Gardiens - Optional("vrijdag, 24 feb.")
    Rundvlees
    Kastanjechampignons
Run Code Online (Sandbox Code Playgroud)

使用漂亮的打印代码:

if let objects = fetchController?.fetchedObjects as? [Gerecht] {
    for object in objects {
        print("\(object.basis ?? "") - \(object.dateString)")
        print("\t\(object.vlees ?? "")")
        print("\t\(object.vega ?? "")")
    }
}
Run Code Online (Sandbox Code Playgroud)

这正是它应该的样子。因此,FetchController 保存了正确的对象并对其进行了正确的排序。然而,该视图看起来像这样:

埃塔菲尔视图

章节标题错误。检索章节标题的代码如下:

override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
    if let sections = fetchController?.sections, sections.count > 0 {
        return sections[section].name
    } else {
        return nil
    }
}
Run Code Online (Sandbox Code Playgroud)

我认为这是尽可能通用的。它检索错误的章节标题可能会出现什么问题?

编辑:-CellForRow 方法

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "Eettafel") as? Eettafel_Cell
    let gerecht = fetchController?.object(at: indexPath) as? Gerecht
    if let gerecht = gerecht {
        cell?.gerecht = gerecht
    }

    return cell!
}
Run Code Online (Sandbox Code Playgroud)

编辑 - cellForRow 中的 Gerecht

打印 NSManagedObject 的描述(if-let gerecht 处的断点)给出:

Printing description of gerecht.some:
<Almanapp.Gerecht: 0x1740b77c0> (entity: Gerecht; id: 0xd0000000000c0000 <x-coredata://A6B5411D-DF77-43DE-8084-86C76C42F68A/Gerecht/p3> ; data: {
    basis = "Hollandse stoof met bokbier";
    date = "2017-02-20 00:23:07 +0000";
    dateString = "maandag, 20 feb.";
    status = nil;
    vega = "Quorn gehakt";
    vlees = Gehaktballetjes;
})
Run Code Online (Sandbox Code Playgroud)

哪个是对的。

Dan*_*ith 5

您需要按fetchRequest 的sectionNameKeyPath添加排序描述符作为排序描述符数组中的第一项:

  let request: NSFetchRequest<YourMO> = YourMO.fetchRequest()
    let dateSorting = NSSortDescriptor(key: "date", ascending: true)
    let sectionSorting = NSSortDescriptor(key: "sectionIdentifier", ascending: true)
    request.sortDescriptors = [sectionSorting, dateSorting]
    frc = NSFetchedResultsController(fetchRequest: request, managedObjectContext: context, sectionNameKeyPath: "sectionIdentifier", cacheName: nil)
Run Code Online (Sandbox Code Playgroud)