6

アプリ バンドルに画像のリストがあり、適切な画像をアプリに表示する必要があります。画像の形式は次のとおりです。

###_photo_#.jpg

###: toy id, from 1000 to 2000
#: photo id, from 1

たとえば

1000_photo_1.jpg
1000_photo_2.jpg

以前は、バンドル内のファイルのリストを取得し、述語を使用して他のファイルを除外していました。

@"self ENDSWITH '.jpg' AND self BEGINSWITH '%d_photo_'", toyId

しかし、現在 @2x.jpg で終わる Retina 画像があるため、この方法を修正する必要があります。追加することを考えています。

NOT ENDSWITH '@2x.jpg'

しかし、これは正しいですか?私は言うべきですか:

NOT (ENDSWITH '@2x.jpg')

また:

(NOT ENDSWITH '@2x.jpg')

代わりは?

4

4 に答える 4

8

次のような述語文字列を使用できます。

@"(self ENDSWITH '.jpg') AND NOT (self ENDSWITH '@2x.jpg') AND (self BEGINSWITH '%d_photo_')"
于 2012-08-02T02:23:52.477 に答える
5

述語を別の述語にカプセル化できます。

NSPredicate *positivePredicate = [NSPredicate ...];
NSPredicate *negativePredicate = [NSCompoundPredicate notPredicateWithSubpredicate: positivePredicate];

これにより、既存の判読可能なフォーマット文字列を保持できます。NSCompoundPredicateを使用すると、AND および OR 述語も作成できることに注意してください。これら 3 つ (AND、OR、NOT) から、XNOR 述語や NAND 述語などを導出することもできます (ただし、その方法は読者に委ねられています...)。

于 2012-08-02T02:27:11.197 に答える
1

iOS 4.0+ でのより良いオプションは、 を使用NSPredicate predicateWithBlock:して条件を定義することだと思います。そうすれば、標準の NSString 関数を使用hasSuffix:して、endsWith の負のケースをチェックできます。

ここで良いチュートリアルをチェックしてください: http://www.wannabegeek.com/?p=149

基本的な使い方をご紹介します。

NSInteger toyId = 10;
NSPredicate *predicate = [NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) {
  return [evaluatedObject hasSuffix:@".jpg"] &&
  ![evaluatedObject hasSuffix:@"@2x.jpg"] &&
  [evaluatedObject hasPrefix:[NSString stringWithFormat:@"%@_photo_", [NSNumber numberWithInt:toyId]]];
}];

その後、ファイルの配列を取得できます

[arrayOfFiles filterArrayUsingPredicate:predicate];
于 2012-08-02T02:10:01.253 に答える