带有索引 UITableViewController 和 UILocalizedIndexedCollation 的 NSFetchedResultsController
Posted
技术标签:
【中文标题】带有索引 UITableViewController 和 UILocalizedIndexedCollation 的 NSFetchedResultsController【英文标题】:NSFetchedResultsController with indexed UITableViewController and UILocalizedIndexedCollation 【发布时间】:2013-02-16 00:29:53 【问题描述】:我有一个使用 NSFetchedResultsController 的表。这为我提供了一个包含现有标题的索引
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
return [[_fetchedResultsController sections] count];
-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
return [[[_fetchedResultsController sections] objectAtIndex:section] name];
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
NSInteger numberOfRows = 0;
NSArray *sections = _fetchedResultsController.sections;
if(sections.count > 0)
id <NSFetchedResultsSectionInfo> sectionInfo = [sections objectAtIndex:section];
numberOfRows = [sectionInfo numberOfObjects];
return numberOfRows;
- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView
return [_fetchedResultsController sectionIndexTitles];
- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index
return [_fetchedResultsController sectionForSectionIndexTitle:title atIndex:index];
但我想使用 UILocalizedIndexCollation 来获取完整的字母表。
如何将这些方法连接到 NSFetchedResultsController?
我想我需要从当前的 Collation 中获取索引标题
- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView
return [[UILocalizedIndexedCollation currentCollation] sectionIndexTitles];
但我不知道如何编写此方法
- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index
//How do I translate index here to be the index of the _fetchedResultsController?
return [_fetchedResultsController sectionForSectionIndexTitle:title atIndex:index];
【问题讨论】:
检查我的扩展答案:***.com/a/15587961/1791090 【参考方案1】:我认为您必须遍历获取的结果控制器部分并找到给定标题的匹配部分,例如:
- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index
NSInteger section = 0;
for (id <NSFetchedResultsSectionInfo> sectionInfo in [_fetchedResultsController sections])
if ([sectionInfo.indexTitle compare:title] >= 0)
break;
section++;
return section;
对于没有匹配部分的部分索引标题,您必须决定是否要跳转到“较低”或“较高”部分。上述方法跳转到下一个更高的部分。
【讨论】:
修改了 Martin 的解决方案以跳转到上一个,并且还处理索引可能是“#”之类的情况【参考方案2】:在 Martin 的启发下,我采用的解决方案。
- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index
NSInteger localizedIndex = [[UILocalizedIndexedCollation currentCollation] sectionForSectionIndexTitleAtIndex:index];
NSArray *localizedIndexTitles = [[UILocalizedIndexedCollation currentCollation] sectionIndexTitles];
for(int currentLocalizedIndex = localizedIndex; currentLocalizedIndex > 0; currentLocalizedIndex--)
for(int frcIndex = 0; frcIndex < [[_fetchedResultsController sections] count]; frcIndex++)
id<NSFetchedResultsSectionInfo> sectionInfo = [[_fetchedResultsController sections] objectAtIndex:frcIndex];
NSString *indexTitle = sectionInfo.indexTitle;
if([indexTitle isEqualToString:[localizedIndexTitles objectAtIndex:currentLocalizedIndex]])
return frcIndex;
return 0;
【讨论】:
我试过你的,但恢复到 Martin 的,因为当部分中没有字母时,你的代码经常崩溃。以上是关于带有索引 UITableViewController 和 UILocalizedIndexedCollation 的 NSFetchedResultsController的主要内容,如果未能解决你的问题,请参考以下文章
ValueError:使用带有 seaborn 线图的索引时无法解释输入“索引”