我有一个项目,其资源中包含图像。 例如:image1yellow.png,image2red.png,image3green.png ...... 这些图像的数量可能不同,但我的应用程序必须知道数字和名称。所以我想通过搜索来从资源中收集这些图像...... 标题的“图像”部分是不变的,之后就有一个数字。标题的最后部分始终是颜色名称(所以......变量字符串)>>>图像+ 3 +绿色= image3green。 我想我可以用这些标准进行搜索......
答案 0 :(得分:0)
修改强>
实际上,NSBundle有一种更方便的方法:
URLsForResourcesWithExtension:子目录:inBundleWithURL:
有了这个,您可以获得所有png资源的数组,然后使用它来确定您想要的图像。
要获得以图像开头的资源,您可以使用:
NSArray * array = [NSBundle URLsForResourcesWithExtension:@"png" subdirectory:nil inBundleWithURL:[[NSBundle mainBundle] bundleURL]]; [array indexesOfObjectsPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop) { return [obj isKindOfClass:NSURL.class] && [[((NSURL *) obj) resourceSpecifier] hasPrefix:@"image"]; }];
当然,这是 NOT 检索它的最佳方式,我几乎可以肯定你有一些简单的逻辑来获取图像名称的结尾,你可能会有更好的结果算法(也许你可以只对数组进行排序并使用枚举器)。此外,您可能希望在静态字段中保留最终结果(例如,以图像开头的所有资源)以更快地检索它们,而不是每次都重做所有工作。
基本上,您必须根据您真正想要的内容完成剩余的实现(或者提供逻辑示例以获取最终图像)。
原始回复
我不确定我理解你想要什么,但我认为它是这样的:
NSArray * ressources = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:[[NSBundle mainBundle] resourcePath] error:&error];
你也可以考虑
contentsOfDirectoryAtURL:includingPropertiesForKeys:选项:错误:
答案 1 :(得分:0)
由于您知道文件名的结构,因此在给定一组变量的情况下创建一个具有特定格式的新NSString:
NSUInteger arbitraryNumber = 7;
NSString *color = @"yellow";
NSString *extension = @"png";
NSString *imageName = [NSString stringWithFormat:@"image%d%@.%@", arbitraryNumber, color, extension];
或者将这些图像分配给循环中的数组......
编辑:在明确监督手头的问题后......
以下是使用正则表达式在文件名中获取所需“短语”的递归解决方案。我只为你写了这个并测试了它。当然,这个东西有点棘手,所以如果你把它的文件名像“images23green.png”那么它可能会失败。如果您对此感到担心,您应该了解有关正则表达式的更多信息!
要执行此操作,只需致电[self loadImages]
。
- (void)loadImages
{
NSDictionary *filenameElements = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:@"^(image)\\d+\\w+\\.\\w{3}$", @"^(image)", @"^\\d+", @"^\\w+", @"^\\w{3}", nil] forKeys:[NSArray arrayWithObjects:@"filename", @"image", @"number", @"color", @"fileExtension", nil]];
NSString *string = @"image23green.png"; // Example file name
NSError *error = NULL;
error = [self searchForSubstring:@"image" inString:string withRegexFormatDictionary:filenameElements beginAtIndex:0];
}
- (NSError *)searchForSubstring:(NSString *)key inString:(NSString *)givenString withRegexFormatDictionary:(NSDictionary *)filenameElements beginAtIndex:(NSInteger)index
{
NSError *error = NULL;
NSString *substring = [givenString substringFromIndex:index];
NSString *regexPattern = [filenameElements objectForKey:key];
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:regexPattern options:NSRegularExpressionCaseInsensitive error:&error];
NSArray *matches = [regex matchesInString:substring options:0 range:NSMakeRange(0, [substring length])];
if ([matches count] > 0)
{
NSRange matched = [[matches objectAtIndex:0] rangeAtIndex:0];
NSLog(@"matched: %@", [substring substringWithRange:matched]);
index = 0;
NSString *nextKey;
if ([key isEqualToString:@"image"]) { nextKey = @"number"; index = matched.length; }
else if ([key isEqualToString:@"number"]) { nextKey = @"color"; index = matched.length; }
else if ([key isEqualToString:@"color"]) { nextKey = @"fileExtension"; index = matched.length + 1; }
else if ([key isEqualToString:@"fileExtension"]) { nextKey = nil; }
if (nextKey)
error = [self searchForSubstring:nextKey inString:substring withRegexFormatDictionary:filenameElements beginAtIndex:index];
}
return error;
}
此解决方案接受一个文件名,该文件名的数值为任意长度,任何颜色名称长度只接受字母字符(即不允许使用连字符)和3个字符长的文件扩展名。如果您想要3到4个字符长度的范围,可以通过将{3}
替换为{3-4}
来更改,等等......