2013-04-21 1 views
0

Мне нужно отфильтровать данные в UITableview по тексту, введенному в UISearchbar. Я следовал this example, но там есть данные в NSMutableArray, и я не могу изменить его в соответствии с моими требованиями. Мои данные: NSMutableDictionary. Я застрял на этом долгое время.Фильтр данных NSMutableDictionary в UITableView

Мои данные:

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]; 
NSDictionary *myDict = [NSDictionary dictionaryWithContentsOfFile:path]; 

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

NSArray *tableArray = [myDict objectForKey:@"Black"]; 
[resultArray addObject:@"Black"]; 
[resultDic setValue:tableArray forKey:@"Black"]; 
[sectionsTitle addObject:[NSString stringWithFormat:@"%@", [tableData valueForKey:@"Black"]]]; 
[sectionCord addObject:[NSString stringWithFormat:@"%@", [tableData valueForKey:@"Coordinates"]]]; 
[sectionKeys addObject:@"Section1"]; 

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

[myTable reloadData]; 

Мой стол:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 
    return sectionKeys.count; 
} 


- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { 
    return [sectionKeys objectAtIndex:section]; 
} 


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
    int rowCount; 
    if(self.isFiltered) 
     rowCount = [[filteredTableData objectForKey:[sectionsTitle objectAtIndex:section]] count]; 

    else 
     rowCount = [[tableData objectForKey:[sectionsTitle objectAtIndex:section]] count]; 

    return rowCount; 
} 

- (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(isFiltered){ 
     NSDictionary *dict = [[filteredTableData objectForKey:[sectionsTitle objectAtIndex:indexPath.section]] objectAtIndex:indexPath.row]; 

     cell.textLabel.text = [NSString stringWithFormat:@"%@", [dict objectForKey:@"Name"]]; 
     cell.detailTextLabel.text = [NSString stringWithFormat:@"%@", [dict objectForKey:@"Address"]]; 
    } 
    else{ 
     NSDictionary *dict = [[tableData objectForKey:[sectionsTitle objectAtIndex:indexPath.section]] objectAtIndex:indexPath.row]; 

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


    return cell; 
} 

Мой поиск:

#pragma mark - SearchBar Delegate - 
-(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)text{ 


    if(text.length == 0) 
    { 
     isFiltered = FALSE; 
     NSLog(@"false"); 
    } 
    else 
    { 
     isFiltered = true; 
     NSLog(@"true"); 
     filteredTableData = [[NSMutableDictionary alloc] init]; 

     for (MyAnnotation* ann in tableData) 
     { 
      NSRange nameRange = [ann.title rangeOfString:text options:NSCaseInsensitiveSearch]; 
      NSRange descriptionRange = [ann.description rangeOfString:text options:NSCaseInsensitiveSearch]; 
      if(nameRange.location != NSNotFound || descriptionRange.location != NSNotFound) 
      { 
       [filteredTableData addObject:ann]; 
       //error 
      } 
     } 
    } 

    [myTable reloadData]; 

} 
+0

Можете ли вы показать свой «data.plist»? – Anupdas

+0

Я добавил конструкцию plist к вопросу –

+1

То, как вы формируете свои данные, очень сбивает с толку. Нет необходимости хранить много разных массивов. Вам нужно иметь только два массива. Один будет содержать все значения, а другой будет источником данных в tableView. На основе ваших «ключевых слов фильтра» вы фильтруете данные из основного массива и назначаете dataSource. Перезагрузите таблицуView для изменения данных. Вы можете использовать NSPredicate для фильтрации. Я не могу определить правильный способ фильтрации на основе ваших данных. Я могу помочь, если вы можете предоставить некоторые реальные данные. – Anupdas

ответ

1

Прежде всего, необходимо создать государственный/флаг для контроллера/источника данных, чтобы он знал, что погода находится в режиме поиска/фильтрации.

Затем, если вы находитесь в режиме поиска, укажите методы источника данных в filterArray.

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 
    int numberOfSections = 0; 
    if (_searchMode) 
     { 
       numberOfSections = self.filteredDataDict.allKeys.count; 
     } 
     else 
     { 
       numberOfSections = self.tableData.allKeys.count; 
     } 
    return numberOfSections; 

} 

Надеюсь, что поняли.

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

  • Нет связанных вопросов^_^