UITableView 错误的部分标题
UITableView wrong section titles
我已经被这个错误困住了很长一段时间了。我有一个带有 2 个选项卡的 UITabBar
。第一个包含 UITableViewController
,包含一周中不同日期的膳食。第二个选项卡包含带有登录屏幕的 UIViewController
。
UITableViewController
被称为'EettafelView'。它从在线来源获取膳食(使用 Alamofire)并将其呈现在应用程序中。它们缓存在 CoreData
中,并使用 NSFetchedResultsController
检索以呈现它们。为此,我使用默认值 UITableViewDelegates
(numberOfRowsInSection、numberOfSections 等)- 如果它们相关,我将在编辑中 post。
当加载 tableview 并且我已经设置了 fetchController 并执行了一个 fetch 我 pretty-print 它的 objects 来测试它持有的内容以及 sort-descriptors 是否完成了他们的工作。这导致以下结果:
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
使用 pretty-print 代码:
if let objects = fetchController?.fetchedObjects as? [Gerecht] {
for object in objects {
print("\(object.basis ?? "") - \(object.dateString)")
print("\t\(object.vlees ?? "")")
print("\t\(object.vega ?? "")")
}
}
这正是它应该的样子。因此 FetchController 持有正确的 objects 并正确排序。然而,视图看起来像这样:
章节标题有误。检索章节标题的代码如下:
override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
if let sections = fetchController?.sections, sections.count > 0 {
return sections[section].name
} else {
return nil
}
}
我认为这是尽可能通用的。它检索错误的章节标题可能是什么问题?
编辑:- 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!
}
编辑 - 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;
})
这是正确的。
尝试为此替换您的 titleForHeaderInSection 函数。
override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
if let gerecht = fetchController?.object(at: IndexPath(row: 0, section: section)) as? Gerecht {
return gerecht.dateString
}else{
return nil
}
}
我认为问题出在您使用的是:
if let sections = fetchController?.sections, sections.count > 0 {
return sections[section].name
检查一下然后告诉我
您需要 通过 sectionNameKeyPath 为您的 fetchRequest 添加排序描述符作为 FIRST 项目排序描述符数组:
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)
我已经被这个错误困住了很长一段时间了。我有一个带有 2 个选项卡的 UITabBar
。第一个包含 UITableViewController
,包含一周中不同日期的膳食。第二个选项卡包含带有登录屏幕的 UIViewController
。
UITableViewController
被称为'EettafelView'。它从在线来源获取膳食(使用 Alamofire)并将其呈现在应用程序中。它们缓存在 CoreData
中,并使用 NSFetchedResultsController
检索以呈现它们。为此,我使用默认值 UITableViewDelegates
(numberOfRowsInSection、numberOfSections 等)- 如果它们相关,我将在编辑中 post。
当加载 tableview 并且我已经设置了 fetchController 并执行了一个 fetch 我 pretty-print 它的 objects 来测试它持有的内容以及 sort-descriptors 是否完成了他们的工作。这导致以下结果:
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
使用 pretty-print 代码:
if let objects = fetchController?.fetchedObjects as? [Gerecht] {
for object in objects {
print("\(object.basis ?? "") - \(object.dateString)")
print("\t\(object.vlees ?? "")")
print("\t\(object.vega ?? "")")
}
}
这正是它应该的样子。因此 FetchController 持有正确的 objects 并正确排序。然而,视图看起来像这样:
章节标题有误。检索章节标题的代码如下:
override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
if let sections = fetchController?.sections, sections.count > 0 {
return sections[section].name
} else {
return nil
}
}
我认为这是尽可能通用的。它检索错误的章节标题可能是什么问题?
编辑:- 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!
}
编辑 - 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;
})
这是正确的。
尝试为此替换您的 titleForHeaderInSection 函数。
override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
if let gerecht = fetchController?.object(at: IndexPath(row: 0, section: section)) as? Gerecht {
return gerecht.dateString
}else{
return nil
}
}
我认为问题出在您使用的是:
if let sections = fetchController?.sections, sections.count > 0 {
return sections[section].name
检查一下然后告诉我
您需要 通过 sectionNameKeyPath 为您的 fetchRequest 添加排序描述符作为 FIRST 项目排序描述符数组:
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)