核心数据支持的 UITableView 中的非核心数据数据
Posted
技术标签:
【中文标题】核心数据支持的 UITableView 中的非核心数据数据【英文标题】:Non-Core Data data in a Core Data-backed UITableView 【发布时间】:2010-12-03 03:33:16 【问题描述】:看看 Music.app(或 iPod.app)。根专辑视图有一个“所有歌曲”行。根歌曲视图有一个“随机播放”行。根播放列表视图有一个“添加播放列表...”行。静态数据与(大概)Core Data 数据混合在同一个 UITableView 中。我想知道 Apple 是如何做到这一点的。
我尝试了两种不同的方法,都失败了。与 Music.app 一样,我的视图在 tableHeaderView 中也有一个 UISeachBar。我的第一次尝试跟踪我有多少“静态”行,并调整了提供给需要节和行信息的各种 UITableView 和 NSFetchedResultsController 方法的 indexPath。一切都很好,直到我实现了 NSFetchedResultsControllerDelegate 方法来允许创建、编辑和删除。 insertRowsAtIndexPaths:withRowAnimation:
方法(和类似方法)在我调整后的 indexPaths 上被绊倒了。默认的 indexPaths 也不能正常工作。
我的第二次尝试是在我的主 UITableView 的 tableHeaderView 中嵌套另一个 UITableView 以用于静态行(并将 UISeachBar 容纳在它自己的 tableHeaderView 中)。这种方法甚至没有进入可编辑阶段。 UISearchBar 最终被根 UITableView 的 sectionIndex 清理器重叠,并且在滚动短列表时不再向上滑动到 UINavigationBar 后面。
因此,我不是诊断我的具体问题,而是寻求有关 Apple 如何实现这一目标的建议。他们是否可以一次获取数据,将其缓存在 NSArray 中并构建包含静态和核心数据行的部分和行的嵌套 NSArray?
【问题讨论】:
当然,一旦您公开发布内容...第二种方法重新开始运行,将 tableHeaderView 设置为包含 UISeachBar 和静态 UITableView 的 UIView。我们会看看我能走多远。仍然欢迎提出建议。 【参考方案1】:我最近遇到了同样的问题。我想在表格顶部添加一行包含一些静态内容(所有歌曲)。我通过简单地为第 0 部分插入我自己的部分,然后增加核心数据部分来解决这个问题。 0 变成 1,1 变成 2,等等。
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
return [_fetchedResultsController sections] + 1;
- (NSInteger)tableView:(UITableView *)tv numberOfRowsInSection:(NSInteger)section
if( section == 0 )
return 1;
id <NSFetchedResultsSectionInfo> sectionInfo = [[_fetchedResultsController sections] objectAtIndex:section-1];
return [sectionInfo numberOfObjects];
- (UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)indexPath
// All Charts
if( indexPath.section == 0 && indexPath.row == 0 )
// Set up the custom cell
// Sets
else
// Set up the core data cells
剩下的只是在删除行等时调整 indexPath 部分的问题。
【讨论】:
这正是我第一次尝试时所做的,但在创建、编辑和删除逻辑中似乎有一些方法需要未调整的 indexPaths,然后不透明地传递给期望调整后的 indexPaths 的方法。您可以使用您必须调整索引路径以进行编辑的所有方法名称来更新您的答案吗?也许我错过了一两个。 我想我明白了。我的表视图可以从 NSFetchedResultsController 或从另一个视图传递的预取 NSManagedObjects 数组中提取数据,因此我使用适配器模式来规范化接口。结果发现这些适配器方法之一正在调整它应该返回未调整的值。【参考方案2】:这就是我要做的(建立我自己的缓存)。您的应用程序与 iPod.app 的差异似乎是 NSFetchedResultsControllerDelegate 位。我不认为 iPod.app 提供了那个特定的界面,对吧?因此,没有自动创建/编辑/重新排序支持。
正如您自己所说,它添加了导致您的 indexPath munging 停止工作。
我想你只需要手动滚动这个。这似乎是 Apple API 的典型特征:一旦您偏离了简单的用例,它们的便利功能就会开始出现问题。您应该在错误报告中提交错误,建议您希望它如何工作——希望他们将来会提出一些建议,因为这似乎是其他人可能会遇到的用例。
另外,我不知道您是否需要一直存储在 NSArrays 中,但如果需要,请将您的提取分页并仅在集合变得非常大时才在 RAM 中缓存必要的内容。
我正在开发一个简单的照片应用程序,并且缓存由像光标一样有效工作的东西支持。现在,我最终也将所有内容都保存在内存中,但细节隐藏在一个界面后面,我可以很容易地重构它。该接口看起来像一个数组,但自动知道去网络获取额外的结果集,将它们缓存到 CoreData,并混合来自不同页面的结果。所以,我的 UITableView 委托只是做 [cursor objectAtIndex:blah] 并且魔法隐藏在幕后。这是非常可行的。
苏杰
【讨论】:
以上是关于核心数据支持的 UITableView 中的非核心数据数据的主要内容,如果未能解决你的问题,请参考以下文章
从 UIViewController 中的 UITableView 中删除核心数据
核心数据、UITableView 和 UISegmentedControl
UITableView - 核心数据应用程序中的表视图崩溃,因为删除后行数无效