时间:2016-02-27 16:31:13

标签: ios objective-c nsarray uisearchbar nspredicate

我想在tableView中使用搜索栏。 我有一个带有人的NSArray(NSObject)。在cellForRow中,我正在使用此代码:

Person *person = [[self.sectionedPersonName objectAtIndex:indexPath.section] objectAtIndex:indexPath.row];
cell.textLabel.text = person.fullName;

并且对于searchBar这段代码:

- (void)searchForText:(NSString *)searchText {
    if (searchText.length > 0) {
        searchBar = YES;
    } else {
        searchBar = NO;
    }
        NSLog(@"%@", self.sectionedPersonName);
        NSPredicate *predicate; = [NSPredicate predicateWithFormat:@"SELF.fullName beginswith[c] %@", searchText];
        self.searchResults = [self.sectionedPersonName filteredArrayUsingPredicate:predicate];
}

self.sectionedPersonName包含以下内容:

(
        (
        "<Person: 0x7fc0f6012650>"
    ),
        (
    ),
        (
    ),
        (
        "<Person: 0x7fc0f600f8a0>",
        "<Person: 0x7fc0f60132e0>"
    ),
        (
    ),
        (
    ),
        (
    ),
        (
        "<Person: 0x7fc0f6012d80>"
    ),
        (
    ),
        (
        "<Person: 0x7fc0f6012b30>"
    ),
        (
        "<Person: 0x7fc0f6010100>"
    ),
        (
    ),
        (
    ),
        (
    ),
        (
    ),
        (
    ),
        (
    ),
        (
    ),
        (
    ),
        (
    ),
        (
    ),
        (
    ),
        (
    ),
        (
    ),
        (
    ),
        (
    ),
        (
    )
)

所以我的问题是如何对此进行NSPredicate? 我试过这个,但不起作用:

NSPredicate *predicate; = [NSPredicate predicateWithFormat:@"SELF.fullName beginswith[c] %@", searchText];

错误:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Can't do a substring operation with something that isn't a string (lhs = (
    "Anna Haro"
) rhs = )'

1 个答案:

答案 0 :(得分:5)

你没有一群人,你有一系列的人。因此,您不能简单地过滤数组,因为您的所有比较实际上都是在尝试将字符串数组与字符串进行比较。这就是“奇怪”的原因。你看到的结果和崩溃。

您最好的选择是创建自己的循环来迭代外部数组,然后在每个内部数组上运行谓词。将生成的过滤后的数组添加到一个新的可变数组中,该数组包含整体结果。