在 UITableView 中过滤 NSMutableDictionary 数据

Posted

技术标签:

【中文标题】在 UITableView 中过滤 NSMutableDictionary 数据【英文标题】:Filter NSMutableDictionary data in UITableView 【发布时间】:2013-04-21 12:06:53 【问题描述】:

我需要通过在UISearchbar 中输入的文本过滤UITableview 中的数据。我关注了this example,但NSMutableArray 中有数据,我无法根据我的要求更改它。我的数据是NSMutableDictionary。我被困了很长时间。

我的数据:

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];


【问题讨论】:

你能显示你的“data.plist”吗? 我在问题中添加了一个 plist 结构 形成数据的方式非常混乱。没有必要保留这么多不同的数组。你只需要有两个数组。一个将包含所有值,另一个将是 tableView 的数据源。根据您的“过滤关键字”,您过滤主数组中的数据并分配给数据源。重新加载 tableView 以更改数据源。您可以使用 NSPredicate 进行过滤。我无法根据您给定的数据找出正确的过滤方法。如果你能提供一些真实的数据,我可以帮忙。 【参考方案1】:

首先,您需要为控制器/数据源创建一个状态/标志,以便它知道您处于搜索/过滤模式的天气。

然后,如果您处于搜索模式,请将数据源方法指向过滤数组。

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


希望大家理解。

【讨论】:

以上是关于在 UITableView 中过滤 NSMutableDictionary 数据的主要内容,如果未能解决你的问题,请参考以下文章

iOS UITableView在过滤时滚动插入

如何过滤 UITableView 中的重复数据

将 SearchBar 添加到 uitableview 在过滤过程中遇到错误

如何在 Swift 中使用搜索栏过滤具有自定义单元格的 UITableView 的内容?

通过 UISearchBar 过滤后 UITableView 不滚动顶部

SearchBar 过滤和调整 UITableView 单元格?