2

動的に入力される文字列をスキャンするとき、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のドキュメントからこれらのコードを試しました。

http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Strings/Articles/Scanners.html

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が無限に発生しました。

4

1 に答える 1

1

「aa」を印刷しようとしていますが、これは宣言したばかりなので不要です。それを初期化/何か他のものを印刷してください、そしてそれはうまくいくでしょう。

編集:これが|string|かどうかを検出する良い方法です 「!」が含まれています

NSString *string = @"it works!";
NSRange range = [string rangeOfString:@"!"];
if (range.location != NSNotFound) {
    /* This means the character has been found.
       The position is at range.location. */
}

編集#2:実行時間を測定する方法は次のとおりです。

#include <time.h>
...
clock_t start = clock(), end;
...[do your tasks]...
end = clock();
end = ((double)end - start) / CLOCKS_PER_SEC;
printf("Time taken: %f\n", end);
于 2011-08-16T16:34:53.433 に答える