2

我写了一个在通讯录中搜索人的方法,我希望该方法能够找到“john bigs”,即使我调用该方法[someAdressBook searchName:@"joh"];

我的方法适用于全名,但我在部分名称中遇到问题,这是我的代码:

-(NSMutableArray *) searchName:(NSString *) someName{

    NSRange range;

    NSMutableArray *results = [[NSMutableArray alloc] init];

    for (AddressCards *addressCard in book)
    {
        if (someName != nil && [someName caseInsensitiveCompare:addressCard.name] == NSOrderedSame)
            [results addObject:addressCard.name];

        else {
            range = [addressCard.name rangeOfString:someName];
            if (range.location != NSNotFound)
            [results addObject:addressCard.name];
        }
    }

    NSLog(@"%@", results);

    return results;
}

请帮我解决这个问题。

4

3 回答 3

4

您可以使用 -[NSString rangeOfString:options:] 以不区分大小写的方式进行搜索,因此您可以一步完成:

for (AddressCards *addressCard in book)
{
    if ([addressCard.name rangeOfString:someName options:NSCaseInsensitiveSearch].location != NSNotFound)
    {
        [results addObject:addressCard.name];
    }
}
于 2013-03-05T00:31:41.243 回答
1

您可以像这样使用 NSPredicate:

-(NSMutableArray *) searchName:(NSString *) someName {
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY addressCard.name CONTAINS[c] %@", someName];
    return [NSMutableArray arrayWithArray:[book filteredArrayUsingPredicate:predicate]];
}

这里的诀窍是[c]。这相当于不区分大小写。

请注意,我假设这本书NSArray类型,如果它是NSMutableArray,则使用谓词将过滤“原始”数组。

于 2013-03-05T00:42:01.077 回答
0

你可以用这个

BOOL containsName = [[addressCard.name lowercaseString] containsSubstring: [someName lowercaseString]];
if(containsName)
    [results addObject:addressCard.name];
于 2013-03-05T00:31:27.170 回答