UITableView willDisplayCell没有用空表触发

时间:2014-08-08 19:05:24

标签: core-data tableview

我正在使用coredata和fetchedResultsController来填充tableView,因为当我在搜索栏中放置文本需要4-5秒来显示对象时数据库非常大,所以我开始spinner,然后在搜索结束时停止它。我使用委托方法willDisplayCell,如下所示,但当搜索返回0对象时,spinner不会停止动画,因为willDisplayCell未被触发:

- (BOOL)isFinishedLoadingTableView:(UITableView *)tableView indexPath:(NSIndexPath *)indexPath {
    NSArray *visibleRows = [tableView indexPathsForVisibleRows];   // did verify sorted ascending via logging
    NSIndexPath *lastVisibleCellIndexPath = [visibleRows lastObject];
    // For tableviews with multiple sections this will be more complicated.
    BOOL isPreviousCallForPreviousCell = self.previousDisplayedIndexPath.row + 1 == lastVisibleCellIndexPath.row;
    BOOL isLastCell = [indexPath isEqual:lastVisibleCellIndexPath];
    BOOL isFinishedLoadingTableView = isLastCell && ([tableView numberOfRowsInSection:0] == 1 || isPreviousCallForPreviousCell);
    self.previousDisplayedIndexPath = indexPath;
    return isFinishedLoadingTableView; }

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath
*)indexPath {
    BOOL isFinishedLoadingTableView = [self isFinishedLoadingTableView:tableView indexPath:indexPath];
    if (isFinishedLoadingTableView) {
        [activityIndicatorView stopAnimating];
    }
}

这里是FRC:

(NSFetchedResultsController *)fetchedResultsController{
    if (_fetchedResultsController != nil) {
        return _fetchedResultsController;
    }
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"CivicoEntity" inManagedObjectContext:context];
    [fetchRequest setEntity:entity];
    [fetchRequest setFetchBatchSize:20];

    NSMutableArray *finalSearchTextArray = [[NSMutableArray alloc]init];
    NSArray *tempSearchTextItems = [self.searchText componentsSeparatedByString:@" "];

    for (NSString *string in tempSearchTextItems){
        if([string length]>0)
            [finalSearchTextArray addObject:string];
    }

    if (self.searchText) {
        NSMutableArray *predicatesArray = [[NSMutableArray alloc]init];
        for (NSString *string in finalSearchTextArray) {
            NSPredicate *predicate = [NSPredicate predicateWithFormat:@"indirizzo CONTAINS[cd] %@ OR toponimo CONTAINS[cd] %@", string, string];
            [predicatesArray addObject:predicate];
        }
        NSPredicate * finalPredicate = [NSCompoundPredicate andPredicateWithSubpredicates:predicatesArray];
        [fetchRequest setPredicate:finalPredicate];
    }

    NSSortDescriptor *sort_indirizzo = [[NSSortDescriptor alloc]
                              initWithKey:@"indirizzo" ascending:YES selector:@selector(caseInsensitiveCompare:)];
    NSSortDescriptor *sort_civico = [[NSSortDescriptor alloc]
                              initWithKey:@"civico" ascending:YES selector:@selector(localizedStandardCompare:)];
    [fetchRequest setSortDescriptors:[NSArray arrayWithObjects:sort_indirizzo, sort_civico, nil]];


    NSFetchedResultsController *theFetchedResultsController =
    [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
                                        managedObjectContext:context sectionNameKeyPath:nil
                                                   cacheName:nil];
    self.fetchedResultsController = theFetchedResultsController;
    _fetchedResultsController.delegate = self;
    return _fetchedResultsController;
}

2 个答案:

答案 0 :(得分:0)

willDisplayCell必须显示至少一行/单元格时,将调用tableview方法。这是你的情况,你需要找到一些其他解决方案来停止微调器动画。

尝试插入代码:

[activityIndicatorView stopAnimating];
方法中的

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

在里面,检查:

if (numberOfRows_to_return == 0) {
    [activityIndicatorView stopAnimating];
}

答案 1 :(得分:0)

我打算评论但是没有足够的空间......

如果我的理解是正确的,你有很多选择。

您开发的机制有效,但还有一些其他方法可以考虑执行所需的操作。 (请原谅我,因为我不了解您对Objective-C的经验和技能水平。)

首先,我建议您阅读一些有关如何优化NSFetchedResultsController(FRC)的内容。可能是因为如果在FRC中设置批量大小,数据将更快填充,并且不需要微调器。

我发现这两本书非常有用:来自实用书籍 - “核心数据,第2版,iOS,OS X和iCloud的数据存储和管理”(2013年1月),作者Marcus S. Zarra,以及来自Apress出版社 - 由Michael Privat和Robert Warner撰写的“Pro iOS Persistence Using Core Data”,请注意仍为alpha。

其次,如何过滤搜索数据非常重要。您可以在filter方法中包含一个完成块,该方法将在方法完成后停止动画。

因此,这真的是一个评论,但我没有房间,我会要求你提供更多的信息。特别是有关FRC和搜索机制的信息会有所帮助。