リソースに画像を含むプロジェクトがあります。例: image1yellow.png、image2red.png、image3green.png... これらの画像の数は異なる可能性がありますが、私のアプリはその数と名前を認識している必要があります。というわけで、これらの画像をリソースから検索して集めたいと思います... タイトルの「画像」の部分は一定で、その直後に数字があります。タイトルの最後の部分は常に色の名前です (可変文字列) >>> image+3+green=image3green. この条件で何とか検索できると思いますが…
2 に答える
ファイル名の構造がわかっているので、一連の変数を指定して、特定の形式で新しい 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}
編集
実際、NSBundle にはさらに便利な方法があります。
URLsForResourcesWithExtension:subdirectory:inBundleWithURL:
これにより、すべての png リソースの配列を取得し、それを使用して必要な画像を決定できます。
image で始まるリソースを取得するには、次を使用できます。
NSArray * array = [NSBundle URLsForResourcesWithExtension:@"png" subdirectory:nil inBundleWithURL:[[NSBundle mainBundle] bundleURL]]; [配列 indexOfObjectsPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop) { return [obj isKindOfClass:NSURL.class] && [[((NSURL *) obj) resourceSpecifier] hasPrefix:@"image"]; }];
もちろん、これはそれを取得するための最良の方法ではありません。画像名の末尾を取得する単純なロジックがあるとほぼ確信しています。おそらく、より良いアルゴリズムを使用できます (配列を並べ替えて、列挙子)。また、毎回すべての作業をやり直すのではなく、最終結果 (たとえば、画像で始まるすべてのリソース) を静的フィールドに保持して、それらをより高速に取得することもできます。
基本的に、本当に必要なものに応じて残りの実装を行う必要があります (または、最終的なイメージを取得するためのロジックの例を挙げてください)。
元の応答
私はあなたが何を望んでいるのか理解できませんが、それはそのようなものだと思います:
NSArray * ressources = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:[[NSBundle mainBundle] resourcePath] エラー:&error];
検討することもできます
contentsOfDirectoryAtURL:includePropertiesForKeys:オプション:エラー: