0

iPad アプリ (Xcode 4.6、iOS 6.2、ARC、ストーリーボード) があります。2 つのラベル (lName と lPhone) を持つプロトタイプ セルを含む UITableView があります。Core Data ストアの結果を NSArray に格納しました。サンプルからコードをコピーしましたが、迷ってしまいました! 名前と電話番号の 2 つのフィールドを探しています。どちらでも検索できるようにしたいです。UISearchBar Controller を使用してみましたが、結果がウィンドウ全体に広がり、受け入れられません。だから、私はコントローラなしでこれをやろうとしています。検索で、UITableView に表示されているエントリをフィルター処理する必要があります。これは、このコードで実行することになっています。

MR_findAll (MagicalRecord) を実行すると、コア データ ストア内のすべての属性が取得されます。これは私が迷っているところです - どうすれば配列から 2 つの属性を取得して NSMutableArray allTableDataに入れることができますか、それともこの場合は必要でしょうか?

これまでのところ、これは私のコードです:

NSArray *allDataArray = [ClientInfo MR_findAll];

//  move objects from Core Data store to NSMutablearray
[allTableData addObjectsFromArray:allDataArray];

if(text.length == 0)  {
    isFiltered = FALSE;
}
else  {
    isFiltered = true;
    filteredTableData = [[NSMutableArray alloc] init];

    for (ClientCell* client in allTableData)  {
        NSRange nameRange = [client.lName.text rangeOfString:text options:NSCaseInsensitiveSearch];
        NSRange phoneRange = [client.lPhone.text rangeOfString:text options:NSCaseInsensitiveSearch];

        if(nameRange.location != NSNotFound || phoneRange.location != NSNotFound)  {
            [filteredTableData addObject:client];
        }
    }
}

また、探している 2 つのフィールドに対して NSRange がどのように一致するのかわかりません。私はここで本当に混乱しています。

4

2 に答える 2

1

このrangeOfStringメソッドは、指定された部分文字列がレシーバー文字列で見つかった場合、NSNotFound と等しくないNSRange場所で を返します。コードが行うことは、最初に client.lName.text と client.lPhone.text の検索テキストの範囲をチェックすることです。次に、いずれかの範囲が存在する場合、コードはオブジェクトをfilteredTableDataに追加します。

2 つの属性のみをfilteredTableData に追加する場合、これらの属性を取得するには、既に保存されているオブジェクトにアクセスする必要があるため、これは単に必要ありません。

最後に、この種の検索を自動的に実行するのに役立つ無料の Sensible TableView フレームワークを確認することもお勧めします。

于 2013-05-06T19:54:44.307 に答える
0

あなたはこのようなことをしなければなりません

データをコアデータから配列にフェッチします。これはかなり必須であり、それに関するチュートリアルがたくさんあります。

そして、検索バーのデリゲート メソッドで、このようなものを実装します。配列のフィルタリングを開始して、目的の結果を表示できるようにします

- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar
{
    self.tableView.allowsSelection = YES;
    self.tableView.scrollEnabled = YES;
    NSArray *list = [[NSArray alloc] initWithArray:artists];  
    if (searchBar.text && [searchBar.text length] > 0)
    {
        NSMutableArray *filterContacts = [[NSMutableArray alloc]initWithArray:list];
     //    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"title LIKE %@",searchBar.text ];  
        NSPredicate *predicate = [NSPredicate predicateWithFormat:@"title CONTAINS[c] %@",searchBar.text ];
        [filterContacts filterUsingPredicate:predicate];
        artists = filterContacts;
    }

    [self.tableView reloadData];
    [self updateSearchString:searchBar.text];    
}
于 2013-05-06T23:41:02.133 に答える