UITableView - > numberOfRowsInSection没有像我想的那样工作......

时间:2011-05-08 14:06:13

标签: uitableview core-data nspredicate

我目前在我的项目中遇到以下问题:

我正在使用Core Data从SQLite数据库中检索数据。我使用多个视图来显示数据库的不同部分。我还实现了searchBar来搜索整个数据库。由于我的数据可以划分为三个主要扇区,通过BOOL值,如果状态是“搜索”,我告诉tableView有3个部分,否则整个获取的结果应使用默认的Core Data函数分段划分。当我执行搜索时,检索到的数据按类型和标题排序,并复制到名为“ searchResults ”的NSMutableArray。我的数据模型有一个“type”属性,我用它来知道给定元素属于哪个区域,我也想用这个属性来确定三个tableView部分中每个行应该有多少行(如果一个部分的元素数量为0,则该部分应显示为空,而其他部分填充匹配元素)。我正在使用以下代码来执行此操作,但它根本不起作用!正如你可以看到我的numberOfRowsInSection方法中有一个if-else if-else控件结构,但是我在每个条件中执行的操作的结果总是“null”。对我而言,奇怪的是,如果我在控制结构之外进行任何这些操作,结果就是它应该是的!它给了我正确的行数(当然这对所有部分都是一样的)! 它出了什么问题?(在代码上方你会发现一个红利问题:D)。

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{
    if (searching) {
            NSPredicate *grammarType;
            if (section == 1) {
                grammarType = [NSPredicate predicateWithFormat:@"type == %@", @"Intermediate"];
                [searchResults filterUsingPredicate:grammarType];
                return [searchResults count];
        } else if (section == 2) {
            grammarType = [NSPredicate predicateWithFormat:@"type == %@", @"Advanced"];
            [searchResults filterUsingPredicate:grammarType];
            return [searchResults count];
        } else {
            grammarType = [NSPredicate predicateWithFormat:@"type == %@", @"Basic"];
            [searchResults filterUsingPredicate:grammarType];
            return [searchResults count];
        }
        //If, instead, I use the following it works!
        /*grammarType = [NSPredicate predicateWithFormat:@"type == %@", @"Basic"];
        [searchResults filterUsingPredicate:grammarType];
        return [searchResults count];*/
    } else {
        id <NSFetchedResultsSectionInfo> sectionInfo = [[fetchedResultsController sections] objectAtIndex:section];
        return [sectionInfo numberOfObjects];
    }
}

BONUS :我注意到这些部分的标题标题在搜索时(意味着在我获得搜索结果后)不像往常一样滚动表格,但保持修复在他们的地方。相反,它们的副本似乎是制作的,并且这些工作通常的方式。怎么可能?

2 个答案:

答案 0 :(得分:0)

无法注意到您有两个分支:(section == 1)。也许这让人感到困惑?

答案 1 :(得分:0)

我发现了问题:这是一个简单的错误!我在那里做的是一遍又一遍地过滤相同的数组,因此,当它第一次没有任何对象时,它被过滤为空。所以我刚刚通过更改if-else语句解决了如下问题:

// if (searching)
NSPredicate *grammarType;
    if (section == 1) {
        NSMutableArray *intermediateResults = [NSMutableArray arrayWithArray:searchResults];
        grammarType = [NSPredicate predicateWithFormat:@"type == %@", @"Intermediate"];
        [intermediateResults filterUsingPredicate:grammarType];
        return [intermediateResults count];
    } else if (section == 2) {
        NSMutableArray *advancedResults = [NSMutableArray arrayWithArray:searchResults];
        grammarType = [NSPredicate predicateWithFormat:@"type == %@", @"Advanced"];
        [advancedResults filterUsingPredicate:grammarType];
        return [advancedResults count];
    } else {
        NSMutableArray *basicResults = [NSMutableArray arrayWithArray:searchResults];
        grammarType = [NSPredicate predicateWithFormat:@"type == %@", @"Basic"];
        [basicResults filterUsingPredicate:grammarType];
        return [basicResults count];
    }

很简单,对吗? ;) 无论如何,我仍然没有回答第二个问题:

“我注意到这些部分的标题标题在搜索时(意味着在我获得搜索结果后),不像往常一样与表格一起滚动,而是保持固定在他们的位置。相反,它们的副本似乎是制作的,并且这些工作通常的方式。怎么可能?“