Поиск по всем объектам NSArray словарей - PullRequest
0 голосов
/ 03 апреля 2012

Я реализовал метод поиска для заполнения UITableView из NSArray (mylist):

- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope{

    // reset array
    [self.filteredListContent removeAllObjects]; 

    // check the elements contained in the list
    NSString *cellTitle;

    for (cellTitle in myList){  //CHANGE HERE

        NSComparisonResult result = [cellTitle compare:searchText options:NSCaseInsensitiveSearch range:NSMakeRange(0, [searchText length])];
        if (result == NSOrderedSame){
            [filteredListContent addObject:cellTitle];
        }
    }
}

Теперь я бы использовал тот же метод для поиска символа в objectForKey:@"name" списка NSDictionary:

myList [0]:
{
        gender
        id
        name
        picture }
myList [1]
{
        gender
        id
        name
        picture }

Я бы что-то вроде этого:

- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope{

    [self.filteredFriendsList removeAllObjects]; 

    NSString *cellTitle;


        for (cellTitle in [[friendsList /* all objects */] objectForKey:@"name"]){

        NSComparisonResult result = [cellTitle compare:searchText options:NSCaseInsensitiveSearch range:NSMakeRange(0, [searchText length])];

        if (result == NSOrderedSame){
            [filteredFriendsList addObject:cellTitle];
        }

        }
}

У кого-то есть идеи? Спасибо.

Ответы [ 2 ]

1 голос
/ 06 апреля 2012

Попробуйте это:

for (NSString *name in [friendsList valueForKey:@"name"])
{
    if ([name isEqualToString:searchText]) [filteredFriendsList addObject:name];
}

Ключевым моментом здесь является тот факт, что valueForKey: метод, однажды вызванный для NSArray, вызывает valueForKey: для каждого из своих объектов.

Ps.Если вы хотите сравнение без учета регистра, вы можете сделать так:

NSComparisonResult res = [searchTex caseInsensitiveCompare:name];
if (res == NSOrderedSame) [filteredFriendsList addObject:name];

РЕДАКТИРОВАТЬ: (включить решение для сопоставления подстроки)

if ([name rangeOfString:searchText].location =! NSNotFound) 
{ 
    // 'name' contains 'searchText' 
}
1 голос
/ 05 апреля 2012

Почему бы вам просто не сделать метод:

Friend *friend;

for (friend in friendsList) {
     NSString *cellTitle = [friend objectForKey:@"name"];
     /* do comparison */
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...