0

UITableview で検索しようとしています。UISearchDisplayDelegate、UISearchBarDelegate メソッドを正しい方法で実装しました。これは私の cellForRowAtIndexPath がどのように見えるかです。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if ( cell == nil ) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }


    if (tableView == self.searchDisplayController.searchResultsTableView){
        Contact *contact = [self.filteredListContent objectAtIndex:indexPath.row];

        NSString *text = [NSString stringWithFormat:@"%@ %@",contact.name,contact.firstName];
        NSLog(@"CellForRowAtIndexPath contact text is %@",text);
        cell.textLabel.text = text;


        [cell setAccessoryType:UITableViewCellAccessoryDisclosureIndicator];


    }else{
    NSString *alphabet = [firstIndex objectAtIndex:[indexPath section]];

    //---get all states beginning with the letter---
    NSPredicate *predicate =
    [NSPredicate predicateWithFormat:@"SELF.name beginswith[c] %@",alphabet];
    NSArray *contacts = [listContent filteredArrayUsingPredicate:predicate];
    Contact *contact = [contacts objectAtIndex:indexPath.row];

    NSString *text = [NSString stringWithFormat:@"%@ %@",contact.name,contact.firstName];
    cell.textLabel.text = text;


       [cell setAccessoryType:UITableViewCellAccessoryDisclosureIndicator];
    }

    return cell;

}

そして、これは私の filterContentForSearchText メソッドです

- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope
{
    [self.filteredListContent removeAllObjects]; // First clear the filtered array.

    for (Contact *contact in listContent)
    {
        NSString *searchString = [NSString stringWithFormat:@"%@ %@",contact.name,contact.firstName];
        NSRange range = [searchString rangeOfString:searchText options:NSCaseInsensitiveSearch];
        if (range.location != NSNotFound) {
            [self.filteredListContent addObject:contact];
            [self.searchDisplayController.searchResultsTableView reloadData];
        }
    }
}

奇妙なことは。私の cellForRowAtIndexPath では、正しいデータが返されます。しかし、テーブルビュー自体は私に NO RESULTS ラベルを与え続けます。

これについて何か助けはありますか?

4

3 に答える 3

0

このチュートリアルhow-to-add-search-bar-uitableview に従ってください ..

メソッドcellForRowAtIndexPath:を参照してください。ユーザーがUISearchBarからレコードを検索したときに検索配列を設定する方法...

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *simpleTableIdentifier = @"RecipeCell";
    
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];
    
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:simpleTableIdentifier];
    }
    
    if (tableView == self.searchDisplayController.searchResultsTableView) {
        cell.textLabel.text = [searchResults objectAtIndex:indexPath.row];
    } else {
        cell.textLabel.text = [recipes objectAtIndex:indexPath.row];
    }
    
    return cell;
}
于 2013-02-08T11:00:34.920 に答える
0

最初にUITabelView ドキ​​ュメントの上に UISearchBar を追加します

そして、2つ取り、次のようなメソッドで1つの配列を別の配列に追加NSMutableArrayします。ViewDidLoad

self.listOfTemArray = [[NSMutableArray alloc] init]; // array no - 1
self.ItemOfMainArray = [[NSMutableArray alloc] initWithObjects:@"YorArrayList", nil]; // array no - 2 

[self.listOfTemArray addObjectsFromArray:self.ItemOfMainArray]; // add 2array to 1 array

UISearchBar のデリゲート メソッドを次のように記述します。

- (void)searchBar:(UISearchBar *)theSearchBar textDidChange:(NSString *)searchText
{
        NSString *name = @"";
        NSString *firstLetter = @"";

    if (self.listOfTemArray.count > 0)
         [self.listOfTemArray removeAllObjects];
    
        if ([searchText length] > 0)
        {
                for (int i = 0; i < [self.ItemOfMainArray count] ; i = i+1)
                {
                        name = [self.ItemOfMainArray objectAtIndex:i];
                        
                        if (name.length >= searchText.length)
                        {
                                firstLetter = [name substringWithRange:NSMakeRange(0, [searchText length])];
                                //NSLog(@"%@",firstLetter);
                                
                                if( [firstLetter caseInsensitiveCompare:searchText] == NSOrderedSame )
                                {
                                    // strings are equal except for possibly case
                                    [self.listOfTemArray addObject: [self.ItemOfMainArray objectAtIndex:i]];
                                    NSLog(@"=========> %@",self.listOfTemArray);
                                }
                         }
                 }
         }
         else
         {
             [self.listOfTemArray addObjectsFromArray:self.ItemOfMainArray ];
         }
        
        [self.tblView reloadData];
}

そして書き込みますcellForRowAtIndexPath

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Foobar"];
    if (cell == nil) 
    {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Foobar"];
        
        cell.selectionStyle = UITableViewCellSelectionStyleBlue;
        cell.textLabel.textColor = [UIColor blackColor];
    }
    
        cell.textLabel.text = [self.listOfTemArray objectAtIndex: indexPath.row];
  
    return cell;
}
于 2013-02-08T11:28:03.193 に答える
0
  1. 配列を使用してテーブルにデータを表示する(showDataArray)
  2. 配列を使用してすべての入力値を格納します (dataArray)
  3. showDataArray を使用して、常にテーブルにデータを入力します
  4. 文字範囲が変更されたときの検索フィールドで、 dataArray からの述語を使用してデータをフィルタリングするメソッドを呼び出します
  5. 値を showDataArray に保存します
  6. テーブル reloadData の呼び出し
于 2013-02-08T10:52:03.090 に答える