分割获取的结果控制器会中断搜索显示

Posted

技术标签:

【中文标题】分割获取的结果控制器会中断搜索显示【英文标题】:Sectioning Fetched Results Controller breaks Search Display 【发布时间】:2012-11-17 04:40:57 【问题描述】:

我完全被这个迷惑了,无法弄清楚我错过了什么。可能还有很多关于核心数据的知识需要了解。

这是我的 Fetched Results 控制器,它显示一个无节表,但我的搜索显示控制器工作:

self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request
                                                                    managedObjectContext:self.buckyballDatabase.managedObjectContext
                                                                      sectionNameKeyPath:nil
                                                                               cacheName:nil];

如果我应用 sectionNameKeyPath 来添加部分。添加了部分,但我的搜索显示控制器已损坏,引发以下错误:

*** Assertion failure in -[UITableViewRowData rectForRow:inSection:], /SourceCache/UIKit_Sim/UIKit-2372/UITableViewRowData.m:1630
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'request for rect at invalid index path (<NSIndexPath 0x7481040> 2 indexes [0, 1])'

这是我的表格视图数据源实现其中 filteredList 是一个 NSArray:-

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView

    if (tableView == self.tableView)
    
        return [[self.fetchedResultsController sections] count];
    
    else
    
        return 1;
    


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 

    if (tableView == self.tableView)
    
        return [[[self.fetchedResultsController sections] objectAtIndex:section] numberOfObjects];
    
    else
    
        return [self.filteredList count];
    



- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section

    if (tableView == self.tableView)
    
        return [[[self.fetchedResultsController sections] objectAtIndex:section] name];
    
    else
    
        return nil;
    


- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index

    if (tableView == self.tableView)
    
        if (index > 0)
        
            return [self.fetchedResultsController sectionForSectionIndexTitle:title atIndex:index-1];
        
        else
        
            self.tableView.contentOffset = CGPointZero;
            return NSNotFound;
        
    
    else
    
        return 0;
    


- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView

    if (tableView == self.tableView)
    
        NSMutableArray *index = [NSMutableArray arrayWithObject:UITableViewIndexSearch];
        NSArray *initials = [self.fetchedResultsController sectionIndexTitles];
        [index addObjectsFromArray:initials];
        return index;
    
    else
    
        return nil;
    

cellForRowAtIndexPath 在下面的行中抛出异常:-

UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier
                                                             forIndexPath:indexPath];

请询问是否需要提供更多信息..我在这个问题上摸不着头脑..

【问题讨论】:

尝试使用-dequeueReusableCellWithIdentifier: 而不是-dequeueReusableCellWithIdentifier:forIndexPath: 感谢@chris ...它使搜索显示控制器正常工作。但是核心数据中的任何更新(几次删除)都会破坏表,使得除了索引和节名之外的所有数据都消失了。这件事在没有分段和索引的情况下工作:-(。错误是:CoreData:错误:严重的应用程序错误。在调用 -controllerDidChangeContent: 期间,从 NSFetchedResultsController 的委托中捕获了一个异常。*** -[__NSArrayM insertObject:atIndex:] : 对象不能为 nil 与 userInfo (null) 试试这个:***.com/questions/3077332/… @chris 请将您的 cmets 移动到答案中,以便它可以被接受。 @Answerbot 完成。干杯。 【参考方案1】:

尝试使用-dequeueReusableCellWithIdentifier: 而不是-dequeueReusableCellWithIdentifier:forIndexPath:.

【讨论】:

也许这会有所帮助:***.com/questions/12714737/…

以上是关于分割获取的结果控制器会中断搜索显示的主要内容,如果未能解决你的问题,请参考以下文章

如何在 UISearchController 中使用自定义视图控制器获取结果?

搜索显示控制器如何隐藏导航栏?

iPad 搜索显示控制器从第二个单元格开始显示结果

将控制值发布到控制器

使用没有搜索栏的获取结果控制器过滤表视图?

iOS UISearchController Class Reference