0

私はこれに困惑しています: iPhone Simulator 4.3 および 5.0 でアプリのフィルター機能をテストしましたが、すべてが機能しますが、iPhone では述語によって間違った結果が得られます。(正規表現と関係があると思われますが、エラーは表示されません。)

if (!selectionDidChange)
    return;
[matches release];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"meta LIKE[c] %@",
                          UniversalKeyword];
NSPredicate *regional = [NSPredicate predicateWithFormat:@"regional == NIL OR regional == NO OR "
                         @"(regional == YES AND title.%K != NIL)", CurrentLanguage];
NSPredicate *exclusive = (exclusiveUpgrade ? [NSPredicate predicateWithValue:YES] :
                          [NSPredicate predicateWithFormat:@"exclusive == NIL OR exclusive == NO"]);
NSMutableArray *predicates = [[[NSMutableArray alloc] initWithCapacity:5] autorelease];
for (int i = 0; i < L(keywords); i++)
{
    int selection = [D(A(keywords, i), @"selection") intValue];
    if (selection >= 0)
        A_ADD(predicates, ([NSPredicate predicateWithFormat:@"meta MATCHES[c] %@",
                            S(S(@".*\\b", D(A(D(A(keywords, i), @"values"), selection), @"name")), @"\\b.*")]));
}
NSPredicate *compound = [NSCompoundPredicate andPredicateWithSubpredicates:predicates];
[predicates removeAllObjects];
[predicates addObject:predicate];
[predicates addObject:compound];
predicate = [NSCompoundPredicate andPredicateWithSubpredicates:A_NEW(regional, exclusive,
            [NSCompoundPredicate orPredicateWithSubpredicates:predicates])];
matches = [[entries filteredArrayUsingPredicate:predicate] retain];
selectionDidChange = NO;

明確にするために:

  • entrieskeywordsは辞書の配列ですkeywordsが、少し複雑です。重要なのは、 の各辞書には、 「A、B、C、D」のようなentries名前の文字列が含まれていることです。metaユーザーが「C」を検索すると、正規表現が一致するはずです。コンパイルされた述語をチェックしたところ問題ないように見えたので、問題ではないように思われる他の基準があります。
  • 述語 ( meta LIKE[c] %@) の最初の部分は、iPhone でも期待される結果を示しています。
  • ここでは、便利なマクロをいくつか使用しています: A_ADD = addObject:D = objectForKey:A = objectAtIndex:A_NEW = arrayWithObjects:L = countおよびS = stringByAppendingString:。(ええ、私は怠け者です :D )

私はここで何を見落としていますか?

4

1 に答える 1

1

他の誰かが同様の問題を抱えている場合の重要なポイントは次のとおりです。

  1. NSPredicateiPhoneとiOSシミュレータの対応する実装の間に機能的な違いはありません。
  2. アプリが実際のデバイスでシミュレーターとは異なる動作をする場合は、jmstoneが言ったように、ファイル名やその他の文字列を再確認して大文字にします。
  3. 問題が解決しない場合は、シミュレーターとデバイスの両方からアプリを削除します。Xcodeには多くの自動動作がありますが、シミュレーターまたはデバイス上の何もクリーンアップしません。
于 2012-04-04T23:21:57.973 に答える