1

我有一个基于 TableView 的应用程序,其中包含一个 UISearchBarDelegate。该应用程序按预期工作。表格视图与 UISearchBar 一起显示所有数据。在搜索字段中输入文本时,列表会缩小以匹配输入的文本。

我遇到的问题是,当我单击取消按钮时,键盘会按原样消失,但不会返回原始数组......它仍然会显示搜索到的项目。

在我的 searchBarCancelButtonClicked 部分,我有以下代码:

- (void)searchBarCancelButtonClicked:(UISearchBar *)SearchBar 
{
    SearchBar.text = nil;

    [SearchBar resignFirstResponder];

    [tableView reloadData];
}

我会假设[tableView reloadData]当单击取消按钮时该部分应该重新加载原始数组中的数据,但它不会这样做。关于我在这里可能做错了什么的任何想法?

另外,这是我的 cellForRowAtIndexPath。与其他示例相比,似乎我做的事情是正确的……没有什么明显的突出之处。

-(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;
}

先感谢您!

4

2 回答 2

0

我怀疑问题出在您生成表格结果的方式上。您是否使用临时(过滤)数组来存储用户运行搜索时的数据?查看您的 cellForRowAtIndexPath 方法等会很有帮助。

第一个建议:确保所有的 tableView 委托方法都检查用户是否在搜索。例如,您可以根据需要设置一个 BOOL userSearching,然后每次检查用户是否正在搜索。然后,您可以从正确的数组中选择您的单元格(如果您使用两个,如上所述)。

第二个建议:使用 SearchDisplayController,而不是独立的搜索栏。它为您处理大部分功能。如果你使用这个策略,那么你可以检查用户是否在像 cellForRowAtIndexPath 这样的方法中搜索:

if (tableView == self.searchDisplayController.tableView)... {
    //user is searching, so act appropriately
} else {
    //user is not searching...
}

(这里,tableView 是传递给该方法的局部变量。我正在从内存中编写该代码,因此对任何错误表示歉意。)

如果您需要对这些策略中的任何一个进行更多说明,请告诉我。

于 2012-07-23T10:02:40.757 回答
0

尝试这个::

- (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”是搜索数组。

于 2015-06-24T07:58:26.303 回答