如何在UISearchBar中过滤NSDictionary?

时间:2014-03-20 09:19:59

标签: ios objective-c ios7 nsdictionary

在我的应用中,我正在使用UITableView显示项目列表,UISearchBar来过滤项目列表。所有数据,我都是从sqlite3读取的。

以下是我的代码:

下面的代码用于从本地数据库中检索数据,并将数据保存到NSMutableDictionary被调用的dict中,并将dict添加到NSMutableArray arr_AllTableData中。

-(void)dataFromLocalDB

{

const char *dbpath = [databasePath UTF8String];

sqlite3_stmt    *statement;

if (sqlite3_open(dbpath, &PSATestDB) == SQLITE_OK) 

{

NSString *querySQL = [NSString stringWithFormat:@"SELECT * FROM Test"];

const char *query_stmt = [querySQL UTF8String];

if (sqlite3_prepare_v2(PSATestDB, query_stmt, -1, &statement, NULL) == SQLITE_OK)

{

while (sqlite3_step(statement) == SQLITE_ROW)

{

companyName = [[NSString alloc]initWithUTF8String:(const char *) sqlite3_column_text(statement, 9)];

[arr_Name addObject:companyName];

address = [[NSString alloc]initWithUTF8String:(const char *) sqlite3_column_text(statement, 10)];

[arr_Address addObject:address];

number = [[NSString alloc]initWithUTF8String:(const char *)sqlite3_column_text(statement, 3)];

[arr_TelephoneNo addObject:number];

url = [[NSString alloc]initWithUTF8String:(const char *)sqlite3_column_text(statement, 4)];

[arr_WebAddress addObject:url];

_dict = [[NSMutableDictionary alloc] init];

[_dict setValue:arr_Name forKey:@"Name"];

[_dict setValue:arr_Address forKey:@"Address"];

[_dict setValue:arr_TelephoneNo forKey:@"Number"];

[_dict setValue:arr_WebAddress forKey:@"WebAddress"];

[arr_AllTableData addObject:_dict];

}

sqlite3_finalize(statement);

sqlite3_close(PSATestDB);

}

}

}

以下代码用于在UITableView中显示数据

#pragma mark - UITableView Data source
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView

{

return 1;

}

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

{

if (isFiltered == YES)

{

return [filtered_Name count];

}

else

{

return [arr_AllTableData count];

}

}

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

{

NSString *CellIdentifier = @"listCell";

PSAListCell *List = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

if (isFiltered == YES)

{

List.lbl_name.text = [filtered_Name objectAtIndex:indexPath.row];

}

else

{

List.lbl_name.text = [[_dict objectForKey:@"Name"] objectAtIndex:indexPath.row];

List.lbl_address.text = [[_dict objectForKey:@"Address"] objectAtIndex:indexPath.row];

List.lbl_ContactNO.text = [[_dict objectForKey:@"Number"] objectAtIndex:indexPath.row];

List.lbl_WebAddress.text = [[_dict objectForKey:@"WebAddress"] objectAtIndex:indexPath.row];

}

return List;

}

这是我的UISearch Bar实施代码:

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText

{

if (searchText.length == 0)

{

// set our boolean flag


isFiltered = NO;

}

else

{

//set our boolean flag

isFiltered = YES;



// Alloc And init our filter NSMutable array


filtered_Name = [[NSMutableArray alloc]init];



//fast enumeration





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

for (NSDictionary *dictionary in arr_AllTableData)

{

NSArray *array = [dictionary objectForKey:@"Name"];

[test addObjectsFromArray:array];

}



for (NSString * name in test)

{

 NSRange nameRang = [name rangeOfString:searchText options:NSCaseInsensitiveSearch];

if (nameRang.location != NSNotFound)

{

[filtered_Name addObject:name];


}

}



}


[_ListTable reloadData];

}

我想过滤包含数据的NSDictionary,并希望在UITableView上显示过滤数据,如果数据在字典中不可用,那么它需要调用Web服务吗?

有人可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

您可以使用NSPredicate根据输入字符串过滤arr_AllTableData中的内容。

您可以在下面的链接中找到带谓词的过滤器数组。 http://alexeckermann.com/blog/legacy/filtering-nsarray-with-nspredicates