2

私はテーブルビューで検索するためにこのコードを使用しています:

for (Actor *actorz in arr)
{     
     NSComparisonResult result = [actorz.actorNaam compare:searchText options:(NSCaseInsensitiveSearch|NSDiacriticInsensitiveSearch) range:[actorz.actorNaam rangeOfString:searchText options:(NSCaseInsensitiveSearch|NSDiacriticInsensitiveSearch)]];
     if (result == NSOrderedSame)
     {
          [self.filteredListContent addObject:actorz];
     }   
}

searchTextをactorz.actorNaamと比較するだけでなく、actorz.actorBeschrijvingと比較することがどのように可能になるのでしょうか。そこで、searchTextを2つの文字列と比較したいと思います。

4

2 に答える 2

5

文字列が見つからない場合に位置が設定されたをNSString返す検索メソッド。NSRangeNSNotFound

したがって、結果の場所がではない ことを確認することで、文字列が見つかったかどうかを確認できますNSNotFound。少し逆に聞こえるかもしれませんが、論理はしっかりしています(いわば2つの否定)。

NSRange nameResult  = [actorz.actorNaam rangeOfString:searchText options:NSCaseInsensitiveSearch|NSDiacriticInsensitiveSearch];
NSRange descrResult = [actorz.actorBeschrijving rangeOfString:searchText options:NSCaseInsensitiveSearch|NSDiacriticInsensitiveSearch];

if ( nameResult.location != NSNotFound || descrResult.location != NSNotFound ) {
    [self.filteredListContent addObject:actorz];
}

このスニペットは、名前が等しいだけでなく、検索文字列を含む名前を検索することに注意してください。元のコードを使用して変更することをお勧めします。もちろん、nameResultは不要になるため、削除する必要があります。

NSComparisonResult result = [actorz.actorNaam compare:searchText options:(NSCaseInsensitiveSearch|NSDiacriticInsensitiveSearch) range:[actorz.actorNaam rangeOfString:searchText options:(NSCaseInsensitiveSearch|NSDiacriticInsensitiveSearch)]];
NSRange descrResult = [actorz.actorBeschrijving rangeOfString:searchText options:NSCaseInsensitiveSearch|NSDiacriticInsensitiveSearch];
    
if ( result == NSOrderedSame || descrResult.location != NSNotFound ) {
    [self.filteredListContent addObject:actorz];
}

ただし、もっと簡単な方法があります。述語の使用を検討してください。

NSPredicate *actorPred = [NSPredicate predicateWithFormat:@"actorNaam contains[cd] %@ OR actorBeschrijving contains[cd] %@", searchText, searchText];

self.filteredListContent = [arr filteredArrayUsingPredicate:actorPred];
于 2013-02-15T12:36:35.760 に答える
0

なぜ比較したいのか完全にはわかりません。検索している文字列内に検索テキストが存在するかどうかを確認する方が理にかなっているようです。そのアプローチがうまくいく場合は、これを試してみてください。

NSArray *toCompareTo = @[actorz.actorNaam, actorz.actorBeschrijving];
[toCompareTo enumerateObjectsUsingBlock:^(NSString *object, NSUinteger index, BOOL *stop) {
    if ([object rangeOfString:searchText options:(NSCaseInsensitiveSearch|NSDiacriticInsensitiveSearch)].location != NSNotFound) {
        [self.filteredListContent addObject:object];
        *stop = YES;
    }}];
于 2013-02-15T11:44:39.483 に答える