这几天做了一个通过UISearchBar和UITableView实现城市选择的功能。
主要参考了
和 (PS:非常感谢这些大神的分享,使我收益良多);
这是我自己做的demo:
这里代码我只展示一部分,因为很简单就不一一展示。
-(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText{ if (searchText != nil && searchText.length > 0) { searchText = [searchText uppercaseString];// 转成大写,indexArray存储大写字母,所以输入小写内容无法判断 //if里是判断当前searchText是否在已有的首字大写集合里,之所以用[ChineseString IndexArray:dataList]是当连续输入两个字母比如“aa”时,显示结果为空,这时indexArray和LetterResultArr都被置空 if ([[ChineseString IndexArray:dataList] indexOfObject:searchText] !=NSNotFound) { //1.当searchText的内容“aa”时,显示结果为空,去掉一个“a”,searchText的内容为“a”,这时tableView应该再显示首字母为a的所用内容,这是我们最终想要的结果。 //2.由于之前的“aa”,indexArray和LetterResultArr都为空,所以通过[self.LetterResultArr count] == 0作为判断条件 重新初始化数据 if ([self.LetterResultArr count] == 0) { self.LetterResultArr = [ChineseString LetterSortArray:dataList]; self.indexArray = [ChineseString IndexArray:dataList]; } NSInteger index = [self.indexArray indexOfObject:searchText]; self.showData = LetterResultArr ; self.LetterResultArr = [NSMutableArray array]; self.indexArray = [NSMutableArray array]; [self.LetterResultArr addObject: [self.showData objectAtIndex:index]]; [self.indexArray addObject:@""];//不让右边输出searchText的内容 [tableView reloadData]; } else { self.LetterResultArr = [NSMutableArray array]; self.indexArray = [NSMutableArray array]; [tableView reloadData]; } }else{ //当前else:去掉searchText的内容时,tableView重新显示所有数据 self.indexArray = [ChineseString IndexArray:dataList]; self.LetterResultArr = [ChineseString LetterSortArray:dataList]; [tableView reloadData]; } }
之前有一个地方纠结很久,就是[tableView reloadData],虽然知道它是用来重载tableview,但是不知道它怎么来实现的,后来琢磨一下,它就是重新执行一遍UITableViewDelegate和UItableViewDataSource协议所重写的方法,所以这个过程中协议方法中所用到的self.indexArray和self.LetterResultArr都要重新赋值。
这里给自己做的过程中稍微总结下,作为一名刚入门ios的菜鸟,自然有很多地方不是特别了解,有时候不懂还是要多看下api并且多去敲代码,一直坚信以项目来学习效果最佳。