看一下Music.app(或iPod.app)。根相册视图具有“所有歌曲”行。根歌曲视图有一个“随机”行。根播放列表视图具有“添加播放列表...”行。静态数据混合在同一个UITableView中(可能是)Core Data数据。我想知道Apple是如何实现这一目标的。
我尝试了两种不同的方法,都失败了。像Music.app一样,我的视图在tableHeaderView中也有一个UISeachBar。我的第一次尝试跟踪了我有多少“静态”行,并调整了提供给需要节和行信息的各种UITableView和NSFetchedResultsController方法的indexPath。在我实现NSFetchedResultsControllerDelegate方法以允许创建,编辑和删除之前,一切都运行良好。 insertRowsAtIndexPaths:withRowAnimation:
方法(和类似方法)在我调整后的indexPaths上被绊倒了。默认的indexPaths也不能正常工作。
我的第二次尝试是在我的主要UITableView的tableHeaderView中嵌套另一个UITableView以用于静态行(并将UISeachBar容纳在它自己的tableHeaderView中)。这种方法甚至没有进入可编辑的阶段。 UISearchBar最终被根UITableView的sectionIndex scrubber重叠,滚动短列表时不再在UINavigationBar后面滑动。
因此,我不是在诊断我的具体问题,而是在寻求关于Apple如何实现这一目标的建议。他们是否可以获取数据一次,在NSArray中缓存它并构建包含静态和核心数据行的部分和行的嵌套NSArray?
答案 0 :(得分:3)
我最近遇到了同样的问题。我想在表格顶部添加一些静态内容(All Songs)。我通过简单地为第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部分。
答案 1 :(得分:1)
这就是我要做的事情(构建我自己的缓存)。应用程序与iPod.app中的皱纹似乎是NSFetchedResultsControllerDelegate位。我不认为iPod.app提供那种特殊的界面,对吗?因此,没有自动创建/编辑/重新排序支持。
正如你自己所说,它正在添加,导致你的indexPath重置停止工作。
我想你只需要手动滚动它。这似乎是Apple的API的典型特征:一旦您偏离了简单的用例,它们的便利功能就会开始遇到问题。你应该在bugreport中提出bug,建议你如何使用它 - 希望它们将来能够提出一些东西,因为这似乎是其他人可能遇到的用例。
另外,我不知道你是否需要一直存储在NSArrays中,但是如果你这样做,请将你的提取页面分页,并且如果该组可能变得非常大,则只缓存RAM中的必要内容。
我有一个简单的照片应用程序我正在处理,缓存由有效像光标一样的东西支持。就目前而言,我最终还是将所有内容保存在内存中,但细节隐藏在一个界面背后,我很容易重构。该界面看起来像一个数组,但自动知道进入网络获取其他结果集,将它们缓存到CoreData,并混合来自不同页面的结果。所以,我的UITableView委托就是[cursor objectAtIndex:blah],魔法隐藏在幕后。这是非常可行的。
Sujal