3

私は自分のアプリに検索可能なテーブルビューを実装しようとしています。そこでは、誰かが場所を検索して結果を得ることができます。これは次のようになります。

ここに画像の説明を入力してください

私はgenomes.comからソースを取得しています。これは、都市だけでなく、公園、建物、郡なども提供しています。都市である場所だけを表示したいと思います。

データは、JSONKitによって解析されるJSONファイルです。ファイル全体(最大20個のオブジェクト)が入ってくると、検索可能なテーブルビューにそれが表示されます。JSONファイルを別の方法で解析する必要があるのか​​、それともテーブルビューに必要な結果のみを表示させる必要があるのか​​わかりません。(この場合のパフォーマンスは問題ではありません。)JSONファイルはNSArrayに変換されます。

配列の一部は次のとおりです。

 {
    adminCode1 = MA;
    adminCode2 = 027;
    adminName1 = Massachusetts;
    adminName2 = "Worcester County";
    adminName3 = "";
    adminName4 = "";
    adminName5 = "";
    continentCode = NA;
    countryCode = US;
    countryName = "United States";
    elevation = 178;
    fcl = A;
    fclName = "country, state, region,...";
    fcode = ADMD;
    fcodeName = "administrative division";
    geonameId = 4929431;
    lat = "42.2000939";
    lng = "-71.8495163";
    name = "Town of Auburn";
    population = 0;
    score = "53.40083694458008";
    timezone =         {
        dstOffset = "-4";
        gmtOffset = "-5";
        timeZoneId = "America/New_York";
    };
    toponymName = "Town of Auburn";
},

私がやりたいのは、「fcl」(配列に表示される)がPに等しい場合、それをテーブルビューに表示することです。「fcl」が他の文字である場合、テーブルビューに表示されたくありません。ifステートメントでそれができると確信していますが、その一部をフィルタリングするように取得する方法がわかりません。

どんな助けでもいただければ幸いです!ありがとう

編集:今のところ、これは検索するコードです:

    - (void)delayedSearch:(NSString*)searchString
{
    [self.geoNamesSearch cancel];
    [self.geoNamesSearch search:searchString
                        maxRows:20
                       startRow:0
                       language:nil];
}

- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString
{
    self.searchDisplayController.searchBar.prompt = NSLocalizedStringFromTable(@"ILGEONAMES_SEARCHING", @"ILGeoNames", @"");
    [self.searchResults removeAllObjects];

    // Delay the search 1 second to minimize outstanding requests
    [NSObject cancelPreviousPerformRequestsWithTarget:self];
    [self performSelector:@selector(delayedSearch:) withObject:searchString afterDelay:0];

    return YES;
}
4

4 に答える 4

3

あなたの質問は基本的に、検索バーの文字列から配列をどのようにフィルタリングするかです。もしそうなら、あなたはテキストがいつ変化するかを検出しUISearchBarDelegate、次にあなたが探している文字列を含むそれらのオブジェクトをコピーするあなたの配列を通過することができます、すなわち

これは、必要なデリゲートメソッドですsearchBar:textDidChange:

[filterArray removeAllObjects];
for(int i = 0; i < [normalArray count]; i++){
    NSRange textRange;
    textRange =[[[[normalArray objectAtIndex:i] objectForKey:@"name"] lowercaseString] rangeOfString:[searchBarString lowercaseString]];
    //I wasn't sure which objectForKey: string you were looking for, just replace the one you want to filter.
       if(textRange.location != NSNotFound)
       {

        [filterArray addObject:[normalArray objectAtIndex:i]];

       }
}

filterTableView = YES;
[tableView reloadData];

bool値に注意してfilterTableViewください。これは、tableViewが正常にロードされるか、作成したフィルター済みバージョンのいずれかを認識できるようにするためです。これは次の場所に実装します。

tableView:numberOfRowsInSection:  //For number of rows.
tableView:cellForRowAtIndexPath:  //For the content of the cells.

これがあなたが探していたものであることを願っています。

于 2012-07-24T22:38:00.843 に答える
2
NSMutableArray* filtered = [[NSMutableArray alloc] autorelease];

for (int i=0;i<[data count];i++)
{
   NSDictionary* item=[data objectAtIndex:i];

   if (@"P" == [item objectForKey:@"fcl"] )
  {
    [filtered addObject:item];
  }
}
于 2012-07-24T23:31:36.887 に答える
1

したがって、検索フィールドが変更されるたびに、新しい配列を計算してから、テーブルビューを再読み込みします。行数は、フィルター処理された配列の行数になります。

新しい配列を計算するには、次のようにします(辞書の配列を想定)。

NSString *searchString; // from the search field
NSMutableArray *array = [NSMutableArray arrayWithCapacity:[origArray count]];
for(NSDictionary *dict in origArray) {
  NSString *val = [dict objectForKey:@"fcl"];
  if([val length] >= searchString) {
    NSString subString = [val substringToIndex:[searchString length]];
    if([subString isEqualToString:val]) [array addObject:dict];
  }
}

次に、各セルは新しい配列から値を取得します。

于 2012-07-24T22:36:44.090 に答える
0

jsonをNSDictionaryに入れて、次のようにします。

if ([[yourJson objectForKey:@"fcl"] stringValue] == @"A")
    //doSomething
于 2012-07-24T22:36:30.480 に答える