Ios UISearchBar取消按钮未重新加载原始阵列
我有一个基于TableView的应用程序,其中包含了一个UISearchBarDelegate。应用程序按预期工作。将显示包含所有数据的tableview以及UISearchBar。在搜索字段中输入文本时,列表将缩小以匹配输入的文本 我遇到的问题是,当我单击“取消”按钮时,键盘会消失,但不会返回原始数组……它仍会显示搜索的项目 在我的searchBarCancelButtonClicked部分中,我有以下代码:Ios UISearchBar取消按钮未重新加载原始阵列,ios,xcode,uitableview,searchbar,Ios,Xcode,Uitableview,Searchbar,我有一个基于TableView的应用程序,其中包含了一个UISearchBarDelegate。应用程序按预期工作。将显示包含所有数据的tableview以及UISearchBar。在搜索字段中输入文本时,列表将缩小以匹配输入的文本 我遇到的问题是,当我单击“取消”按钮时,键盘会消失,但不会返回原始数组……它仍会显示搜索的项目 在我的searchBarCancelButtonClicked部分中,我有以下代码: - (void)searchBarCancelButtonClicked:(UISe
- (void)searchBarCancelButtonClicked:(UISearchBar *)SearchBar
{
SearchBar.text = nil;
[SearchBar resignFirstResponder];
[tableView reloadData];
}
我假设当单击取消按钮时,[tableView reloadData]
部分应该从原始数组重新加载数据,但它没有这样做。你知道我在这里做错了什么吗
还有,这是我的手机号码。与其他例子相比,似乎我做的事情是正确的……没有什么明显的问题
-(UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MyIdentifier"];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"MyIndentifier"];
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
}
StateDetail *cd;
if(isFiltered)
cd = [self.searchStates objectAtIndex:indexPath.row];
else
cd = [self.listOfStates objectAtIndex:indexPath.row];
cell.textLabel.text = cd.stateName;
return cell;
}
提前谢谢你 我怀疑问题出在生成表格结果的方式上。当用户运行搜索时,是否使用临时(过滤)数组存储数据?查看您的cellForRowAtIndexPath方法等会有所帮助 第一个建议:确保所有tableView委托方法都检查用户是否正在搜索。例如,您可以根据需要设置BOOL usersearch,然后每次检查用户是否正在搜索。然后,您可以从正确的数组中选择单元格(如果您使用的是两个数组,如上所述) 第二个建议:使用SearchDisplayController,而不是独立的搜索栏。它为您处理大部分这类功能。如果使用此策略,则可以检查用户是否使用以下方法在cellForRowAtIndexPath等方法中搜索:
if (tableView == self.searchDisplayController.tableView)... {
//user is searching, so act appropriately
} else {
//user is not searching...
}
(这里,tableView是传递到方法中的局部变量。我是从内存中编写代码的,因此对于任何错误,我深表歉意。)
如果您需要关于这两种策略的更多说明,请告诉我。试试以下方法:
- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar {
isSearching = YES;
self.searchBar.showsCancelButton = YES;
for (UIView *subView in searchBar.subviews) {
if ([subView isKindOfClass:[UIButton class]]) {
UIButton *cancelButton = (UIButton*)subView;
[cancelButton setTitle:@"hi" forState:UIControlStateNormal];
}
}
self.searchBar.autocorrectionType = UITextAutocorrectionTypeNo;
UITextField *textField = [self.searchBar valueForKey:@"_searchField"];
textField.clearButtonMode = UITextFieldViewModeNever;
}
- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText {
NSLog(@"Text change - %d",isSearching);
for (UIView *subview in searchBar.subviews)
{
if ([subview conformsToProtocol:@protocol(UITextInputTraits)])
{
[(UITextField *)subview setClearButtonMode:UITextFieldViewModeNever];
}
}
//Remove all objects first.
[filteredContentList removeAllObjects];
if([searchText length] != 0) {
isSearching = YES;
// [self searchTableList];
if([searchBar.placeholder isEqualToString:@"Search by course name"]){
NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:@"courseName CONTAINS[cd] %@",_searchBar.text];
filteredContentList = [[listArray filteredArrayUsingPredicate:resultPredicate] mutableCopy];
}
else if([searchBar.placeholder isEqualToString:@"Search by category name"]){
NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:@"category CONTAINS[cd] %@",_searchBar.text];
filteredContentList = [[listArray filteredArrayUsingPredicate:resultPredicate] mutableCopy];
}
}
else {
isSearching = NO;
// [searchBar resignFirstResponder];
}
// [self.tableView reloadData];
// [searchBar resignFirstResponder];
[self.tableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO];
}
- (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar {
NSLog(@"Cancel clicked");
self.searchBar.text=@"";
[searchBar resignFirstResponder];
isSearching=NO;
[self.tableView reloadData];
}
- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar {
NSLog(@"Search Clicked");
// [self searchTableList];
//
[self.tableView reloadData];
[searchBar resignFirstResponder];
}
这里的“isSearching”是布尔值,
“listArray”是初始数组,
“filteredContentList”是搜索数组。感谢您抽出时间回复我的帖子。我很感激。关于数组,我使用两个数组(一个作为主数组,另一个作为搜索结果数组),它们都在我的.h和.m文件中声明和合成。我已更新了我的原始帖子,以包括我的CellForRowatineXpath。我已经看过了其他一些使用搜索栏的例子,但是没有什么突出的问题。