動的に入力される文字列をスキャンするとき、nsscannerは彼女の仕事をすることができないようです。最初にコードを書いてみましょう。
NSString *setext = mySearchBar.text;
NSScanner *scanner = [NSScanner scannerWithString:setext];
NSString *a = @"a";
NSString *aa;
[scanner scanUpToString:a intoString:NULL];
while ([scanner isAtEnd] == NO)
{
if ( [scanner scanString:a intoString:NULL]);
{
NSLog (@" scan: %@ ", aa);
}
}
これらのコードを多くの方法で試しましたが、同じ結果が得られました。検索バーに何かを書き込むと、シミュレーターはクラッシュログなしで自動的に終了しました。mySearchBarはプログラムで追加され、UISearchBarクラスであり、selfにリンクされています。
検索と比較のためにfilterContentメソッドでsetextをsearchTextに書き直そうとすると、NSLogはどちらかを無限に表示します
- 「スキャン:MainViewController」
また
- 「スキャン:(最初に入力した文字)」
その後、クラッシュしました。MainViewControllerはUIViewControllerクラスです。
私はAppleのドキュメントからこれらのコードを試しました。
NSString *string = @"Product: Acme Potato Peeler; Cost: 0.98 73\n\
Product: Chef Pierre Pasta Fork; Cost: 0.75 19\n\
Product: Chef Pierre Colander; Cost: 1.27 2\n";
NSCharacterSet *semicolonSet;
NSScanner *theScanner;
NSString *PRODUCT = @"Product:";
NSString *COST = @"Cost:";
NSString *productName;
float productCost;
NSInteger productSold;
semicolonSet = [NSCharacterSet characterSetWithCharactersInString:@";"];
theScanner = [NSScanner scannerWithString:string];
while ([theScanner isAtEnd] == NO)
{
if ([theScanner scanString:PRODUCT intoString:NULL] &&
[theScanner scanUpToCharactersFromSet:semicolonSet
intoString:&productName] &&
[theScanner scanString:@";" intoString:NULL] &&
[theScanner scanString:COST intoString:NULL] &&
[theScanner scanFloat:&productCost] &&
[theScanner scanInteger:&productSold])
{
NSLog(@"Sales of %@: $%1.2f", productName, productCost * productSold);
}
}
そしてそれはどんな方法でも完璧に機能します。このコードのNSLogは一度現れて、完全に書かれています。しかし、なぜこのコードが機能するのか、私のものではないのかわかりません。
私の目標は、検索バーで特殊文字を検出することです。検索バーのテキストにそのような文字が含まれている場合は、で無効NSDiactricInsensitiveSearch
にすることができNSComparisonResult
ます。次に、検索結果に、特殊文字を含む単語が表示されます。この特殊文字は、ダイアクト文字の一部ではありません。
8月16日編集:
わかりました、これがnscomparisonresultの私のコードです。@JohnBrighton: `ソリューションは機能しますが、nslogがforループに入ったため、入力した最初の文字のアプリで何もクリックできませんでした... forループの前にこれらのコードを貼り付けると、検索が機能しません。
for (mystr in noWords) {
NSComparisonResult result;
NSString *string = mySearchBar.text;
NSRange range = [string rangeOfString:@"ø"];
if (range.location != NSNotFound) {
result = [mystr compare:searchText options:(NSCaseInsensitiveSearch)
range:NSMakeRange(0, [searchText length])];
NSLog (@" detected");
}
else
{
result = [mystr compare:searchText options:(NSCaseInsensitiveSearch|NSDiacriticInsensitiveSearch)
range:NSMakeRange(0, [searchText length])];
NSLog(@"normal");
}
if (result == NSOrderedSame)
{
[self.filteredListContent addObject:mystr];
}
}
8月17日編集、上記のコードを書き直して、メソッド全体が表示されるようにします。
- (void)filterContentForSearchText:(NSString*)searchText
{
for (mystr in noWords)
{
clock_t start = clock(), end;
NSComparisonResult result;
NSString *string = searchText;
NSRange range = [string rangeOfString:@"æ"];
NSRange range2 = [string rangeOfString:@"ø"];
NSRange range3 = [string rangeOfString:@"å"];
if (range.location != NSNotFound||range2.location != NSNotFound ||range3.location != NSNotFound ) {
// This means the character has been found.
// The position is at range.location.
result = [mystr compare:searchText options:(NSCaseInsensitiveSearch)
range:NSMakeRange(0, [searchText length])];
}
else {
result = [mystr compare:searchText options:(NSCaseInsensitiveSearch|NSDiacriticInsensitiveSearch)
range:NSMakeRange(0, [searchText length])];
}
end = clock();
end = ((double)end - start) / CLOCKS_PER_SEC;
printf("Time taken: %f \n", (double)end);
if (result == NSOrderedSame)
{
[self.filteredListContent addObject:mystr];
}
}
}
以前のコードの「所要時間:0.0000」ではなく、「所要時間:0」を示すNSLogが無限に発生しました。