2013-04-27 4 views
0

Теперь моя работа по поиску по sectionsTitle, если я пишу «Категория1» или «Категория2», он найдет раздел Category1 или Category2, но мне нужно искать по NAMES во всем этом разделы, отсюда:Невозможно реализовать фильтр поиска для моих данных таблицы, используя NSPredicate

NSDictionary *dict = [[tableData objectForKey:[sectionsTitle objectAtIndex:indexPath.section]] objectAtIndex:indexPath.row]; 
[NSString stringWithFormat:@"%@", [dict objectForKey:@"Name"]]; 

Что мне нужно изменить в своем коде для поиска по названиям? Теперь я запутался со всем, что NSArray-х, NSMutableArray-х и NSDictionary :(

загружаю мои данные, как это:

NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); 
NSString *path = [[documentPaths lastObject] stringByAppendingPathComponent:@"data.plist"]; 
NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:path]; 

NSMutableDictionary *resultDic = [[NSMutableDictionary alloc] init]; 
NSMutableArray *resultArray = [[NSMutableArray alloc] init]; 

sectionKeys = [NSMutableArray new]; 
sectionsTitle = [NSMutableArray new]; 


     if ([[NSUserDefaults standardUserDefaults] boolForKey:@"blueKey"]) 
     { 

      ann = [dict objectForKey:@"Category1"]; 
      [resultArray addObject:@"Category1"]; 
      [resultDic setValue:ann forKey:@"Category1"]; 
      [sectionKeys addObject:@"Section 1"]; 

     } 


     if ([[NSUserDefaults standardUserDefaults] boolForKey:@"yellowKey"]) 
     { 
      ann = [dict objectForKey:@"Category2"]; 
      [resultArray addObject:@"Category2"]; 
      [resultDic setValue:ann forKey:@"Category2"]; 
      [sectionKeys addObject:@"Section 2"]; 

     } 


self.tableData = resultDic; 
self.sectionsTitle = resultArray; 

[myTable reloadData]; 

Это, как я фильтровать данные:

- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope 
{ 
    NSPredicate *resultPredicate = [NSPredicate 
            predicateWithFormat:@"SELF contains[cd] %@", 
            searchText]; 
    searchResults = [sectionsTitle filteredArrayUsingPredicate:resultPredicate]; 

} 

-(BOOL)searchDisplayController:(UISearchDisplayController *)controller 
shouldReloadTableForSearchString:(NSString *)searchString 
{ 
    [self filterContentForSearchText:searchString 
           scope:[[self.searchDisplayController.searchBar scopeButtonTitles] 
             objectAtIndex:[self.searchDisplayController.searchBar 
                selectedScopeButtonIndex]]]; 

    return YES; 
} 

Это как выглядит мой стол:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 

     if (tableView == self.searchDisplayController.searchResultsTableView) { 
      return 1; 
     }else{ 
     return sectionKeys.count; 
     } 

} 


- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { 

     if (tableView == self.searchDisplayController.searchResultsTableView) { 
      return @"Search"; 
     }else{ 
      return [sectionKeys objectAtIndex:section]; 
     } 

} 



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

     if (tableView == self.searchDisplayController.searchResultsTableView) { 

      return [searchResults count]; 

     } else { 
      int num = [[tableData objectForKey:[sectionsTitle objectAtIndex:section]] count]; 
      return num; 
     } 

} 


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

     static NSString *CellIdentifier = @"Cell"; 

     UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
     if (cell == nil) 
      cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier]; 


     if (tableView == self.searchDisplayController.searchResultsTableView) { 

      cell.textLabel.text = [searchResults objectAtIndex:indexPath.row]; 

     } else { 
      NSDictionary *dict = [[tableData objectForKey:[sectionsTitle objectAtIndex:indexPath.section]] objectAtIndex:indexPath.row]; 


      cell.textLabel.font = [UIFont fontWithName:@"Avenir" size: 16.0]; 
      cell.detailTextLabel.font = [UIFont fontWithName:@"Avenir" size: 12.0]; 

      cell.textLabel.text = [NSString stringWithFormat:@"%@", [dict objectForKey:@"Name"]]; 
      cell.detailTextLabel.text = [NSString stringWithFormat:@"%@", [dict objectForKey:@"Address"]]; 

     } 

     return cell; 
} 

Мои данные структура:

enter image description here

+0

Я отредактировал код и добавил структуру данных image –

+0

В каждой категории есть много словарей Item0, Item1 и т. Д. –

ответ

0

С упрощенным набором данных (только запись Имя включены в словарях), это должно воспроизводить вашу установку:

NSArray *categories = @[ 
    @[@{@"Name":@"Joe"}, @{@"Name":@"Jane"}], 
    @[@{@"Name":@"Anne"}, @{@"Name":@"Bob"}] 
]; 

Тогда ANY оператор NSPredicate найдет массив вы после того, как:

NSString *nameToSearch = @"Bob"; 
NSPredicate *catPred = [NSPredicate predicateWithFormat:@"ANY Name = %@", nameToSearch]; 

Чтобы увидеть, как этот предикат может фильтровать массив категории:

NSArray *filteredCats = [categories filteredArrayUsingPredicate:catPred]; 

Кстати, вы можете быть немного смущены, если вы создадите некоторые пользовательские объекты, чтобы хранить свои данные, а не полагаться только на массивы и словари.

+0

Извините, я не знаю, как реализовать свой ответ на мой код –

Смежные вопросы