UITableView 错误的部分标题
Posted
技术标签:
【中文标题】UITableView 错误的部分标题【英文标题】:UITableView wrong section titles 【发布时间】:2017-02-20 00:24:54 【问题描述】:我已经被这个错误困扰了很长一段时间了。我有一个带有 2 个标签的 UITabBar
。第一个包含UITableViewController
,在一周的不同日期用餐。第二个选项卡包含带有登录屏幕的UIViewController
。
UITableViewController
被称为“EettafelView”。它从在线资源中获取食物(使用 Alamofire)并将它们呈现在应用程序中。它们缓存在CoreData
中,并使用NSFetchedResultsController
检索以呈现它们。为此,我使用默认的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
使用漂亮的打印代码:
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 拥有正确的对象并对其进行正确排序。然而,视图看起来像这样:
章节标题错误。检索章节标题的代码如下:
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;
)
这是正确的。
【问题讨论】:
Hollandse Stoof 遇到 bokbier 应该在星期一 (maandag)(根据控制台输出),但在屏幕截图中是在星期二 (dinsdag) 请把你的 titleForHeaderInSection 改成:return fetchController?.sections[section].name 告诉我你现在得到了什么 你在 fetchedResultsController 中为sectionNameKeyPath
使用了什么?
@JuanCurti 没有什么不同。还是和截图一样。
@JonRose 我使用 sectionNameKeyPath: "dateString"
【参考方案1】:
您需要为您的fetchRequest按sectionNameKeyPath添加排序描述符作为排序描述符数组中的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】:尝试为此替换您的 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
请检查并告诉我
【讨论】:
改为:if let gerecht = fetchController?.object(at: IndexPath(row: 0, section: section)) as? Gerecht return gerecht.dateString else return nil 否则它不会编译,但它可以工作 是的,它有效,我把它标记为答案。但是仍然很奇怪 fetchController 部分当时没有排序。因为它以正确的顺序保存正确的对象,但不知何故,这些部分的顺序不同。 @Emptyless 没错,我会检查数据是如何获取并解析到 Gerecht 对象中的,看看是否有任何错误。 那是错误的解决方案:secitons 包含错误的单元格!以上是关于UITableView 错误的部分标题的主要内容,如果未能解决你的问题,请参考以下文章
iPhone如何实现一个“宽”的UITableViewCell?
UIViewController 内的 UITableView? [关闭]