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 结尾的视网膜图像,因此需要修复此方法,我正在考虑添加:

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 谓词。从这三个(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 回答
1

试试这个:

NOT something ENDSWITH '@2x.jpg'
于 2014-06-01T10:07:19.600 回答