Uitableview 如何向使用带有NSDictionary的数组的TableView添加搜索栏
到目前为止,我所做的是让搜索栏正常工作Uitableview 如何向使用带有NSDictionary的数组的TableView添加搜索栏,uitableview,nsarray,nsdictionary,uisearchbar,nsmutabledictionary,Uitableview,Nsarray,Nsdictionary,Uisearchbar,Nsmutabledictionary,到目前为止,我所做的是让搜索栏正常工作 - (void)viewDidLoad { [self makeData]; [super viewDidLoad]; self.mySearchBar.delegate = self; self.myTableView.delegate = self; self.myTableView.dataSource = self; //Feedback button code here UIBarButtonItem *feedback; feedbac
- (void)viewDidLoad
{
[self makeData];
[super viewDidLoad];
self.mySearchBar.delegate = self;
self.myTableView.delegate = self;
self.myTableView.dataSource = self;
//Feedback button code here
UIBarButtonItem *feedback;
feedback = [[UIBarButtonItem alloc] initWithTitle:@"Contact" style:UIBarButtonItemStylePlain
target:self action:@selector(showEmail:)];
self.navigationItem.leftBarButtonItem = feedback;
[self.tableView reloadData];
self.tableView.scrollEnabled = YES;
}
-(void) makeData; {
list = [[NSMutableArray alloc] init];
[list addObject:[[NSMutableDictionary alloc]
initWithObjectsAndKeys:@"Acceleration", @"name" ,
@"acceleration.png", @"image" ,
@"Acceleration", @"description" ,nil]];
[list addObject:[[NSMutableDictionary alloc]
initWithObjectsAndKeys:@"Alternating Current", @"name" ,
@"alternating current.png", @"image" ,
@"Alternating Current", @"description" ,nil]];
[list addObject:[[NSMutableDictionary alloc]
initWithObjectsAndKeys:@"Ampere", @"name" ,
@"ampere.png", @"image" ,
@"Ampere", @"description" ,nil]];
[list addObject:[[NSMutableDictionary alloc]
initWithObjectsAndKeys:@"Amplitude", @"name" ,
@"amplitude.png", @"image" ,
@"Amplitude", @"description" ,nil]];
}
-(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
{
if (searchText.length == 0) {
isFiltered = FALSE;
}
else
{
isFiltered = TRUE;
filteredList = [[NSMutableArray alloc] init];
for (NSString *str in list) {
NSRange stringRange = [str rangeOfString:searchText options:NSCaseInsensitiveSearch];
if (stringRange.location != NSNotFound) {
[filteredList addObject:str];
}
}
}
[self.myTableView reloadData];
}
-(void)searchBarSearchButtonClicked:(UISearchBar *)searchBar
{
[self.myTableView reloadData];
}
但每次我尝试在应用程序中键入内容时,都会崩溃,并收到以下消息:
2013-05-29 11:36:09.734 PhysEX[4770:c07] -[__NSDictionaryM rangeOfString:options:]: unrecognized selector sent to instance 0x9468cd0
2013-05-29 11:36:09.735 PhysEX[4770:c07] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSDictionaryM rangeOfString:options:]: unrecognized selector sent to instance 0x9468cd0'
如何使搜索工作正常?textDidChange delegate中的以下代码不正确:
for (NSString *str in list) {
...
}
这是因为列表数组中的对象不是NSString,而是NSDictionary。因此,错误消息指出NSDictionary无法识别选择器rangeOfString:options:因为该选择器用于NSString实例
您需要搜索NSDictionary值
for (NSDictionary *theDictionary in list) {
for (NSString *key in theDictionary) {
NSString *value = [theDictionary objectForKey:key];
NSRange stringRange = [value rangeOfString:searchText options:NSCaseInsensitiveSearch];
if (stringRange.location != NSNotFound) {
[filteredList addObject:theDictionary];
break;
}
}
}
textDidChange委托中的以下代码不正确:
for (NSString *str in list) {
...
}
这是因为列表数组中的对象不是NSString,而是NSDictionary。因此,错误消息指出NSDictionary无法识别选择器rangeOfString:options:因为该选择器用于NSString实例
您需要搜索NSDictionary值
for (NSDictionary *theDictionary in list) {
for (NSString *key in theDictionary) {
NSString *value = [theDictionary objectForKey:key];
NSRange stringRange = [value rangeOfString:searchText options:NSCaseInsensitiveSearch];
if (stringRange.location != NSNotFound) {
[filteredList addObject:theDictionary];
break;
}
}
}
太好了,非常感谢!现在我的搜索工作正常,但每当我点击搜索结果中的一个结果时,它就会链接到对应于原始tableview中相同定位单元格的图像,因此如果加速度是原始值的顶部,我搜索安培,当我在搜索结果中点击安培时,我需要加速?@WilliamRose如果您当前处于搜索模式,则需要修改didSelectRowAtIndexPath中的代码以使用filteredList。-(无效)tableView:(UITableView*)tableView didSelectRowAtIndexPath:(NSIndexPath*)indexPath{DetailViewController*definitionDetail=[[DetailViewController alloc]initWithNibName:@“DetailViewController”捆绑包:nil];definitionDetail.definitionImageString=[[NSString alloc]initWithString:[[list objectAtIndex:Indexath.row]objectForKey:@“image”];definitionDetail.title=[[list ObjectAtIndexath.row]objectForKey:@“name”];[self.navigationController pushViewController:definitionDetail动画:YES];}-(void)tableView:(UISearchDisplayController*)tableView未取消RowAtIndexPath:(NSIndexPath*)indexPath{DetailViewController*definitionDetail=[[DetailViewController alloc]initWithNibName:@“DetailViewController”捆绑包:nil];definitionDetail.definitionImageString=[[NSString alloc]initWithString:[[filteredList objectAtIndex:indexPath.row]objectForKey:@“image”]];definitionDetail.title=[[filteredList ObjectAtIndeXPath.row]objectForKey:@“name”];[self.navigationController pushViewController:definitionDetail动画:是];]太好了,非常感谢!现在我的搜索工作正常了,但每当我点击搜索结果中的一个结果时,它都会链接到对应于原始表视图中相同定位单元格的图像,因此如果加速度是原始值的顶部,我搜索安培,当我点击搜索结果中的安培时,我就会进入加速度?@WilliamRose you n如果当前处于搜索模式,则需要修改didSelectRowAtIndexPath中的代码以使用filteredList。-(无效)tableView:(UITableView*)tableView didSelectRowAtIndexPath:(NSIndexPath*)indexPath{DetailViewController*定义细节=[[DetailViewController alloc]initWithNibName:@“DetailViewController”捆绑包:nil];definitionDetail.definitionImageString=[[NSString alloc]initWithString:[[list objectAtIndex:indexPath.row]objectForKey:@“image”];definitionDetail.title=[[list ObjectAtIndeXPath.row]objectForKey:@“name”];[self.navigationController pushViewController:definitionDetail动画:是];}-(void)tableView:(UISearchDisplayController*)tableView没有取消RowAtIndexPath:(NSIndexPath*)indexPath{DetailViewController*定义细节=[[DetailViewController alloc]initWithNibName:@“DetailViewController”捆绑包:nil];definitionDetail.definitionImageString=[[NSString alloc]initWithString:[[filteredList ObjectAtIndexath.row]objectForKey:@“image”]];definitionDetail.title=[[filteredList objectAtIndex:indexPath.row]objectForKey:@“name”];[self.navigationController pushViewController:definitionDetail动画:是];]