1

UISearchBarDelegateを組み込んだTableViewベースのアプリケーションがあります。アプリケーションは意図したとおりに機能します。テーブルビューは、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 を適切に設定し、ユーザーが検索しているかどうかを毎回確認できます。次に、正しい配列からセルを選択できます (上記で説明したように、2 つ使用している場合)。

2 番目の提案: スタンドアロンの検索バーではなく、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」は bool 値、「listArray」は初期配列、「filteredContentList」は検索配列です。

于 2015-06-24T07:58:26.303 に答える