在资源中搜索图像

时间:2013-02-04 21:18:27

标签: iphone xcode search resources

我有一个项目,其资源中包含图像。 例如:image1yellow.png,image2red.png,image3green.png ...... 这些图像的数量可能不同,但我的应用程序必须知道数字和名称。所以我想通过搜索来从资源中收集这些图像...... 标题的“图像”部分是不变的,之后就有一个数字。标题的最后部分始终是颜色名称(所以......变量字符串)>>>图像+ 3 +绿色= image3green。 我想我可以用这些标准进行搜索......

2 个答案:

答案 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}来更改,等等......