2

プロジェクトに写真を含むフォルダーがあり、フォルダーからこの写真を配列に配置する方法を知りたいです。

どうすればいいですか?

画像を配列に入れるためにこれを試しました

    UIImage*image = [[NSBundle mainBundle]pathsForResourcesOfType:@"jpg" @"jpeg" @"gif" inDirectory:@"Images"];
    NSArray*images = [[NSMutableArray alloc]initWithContentsOfFile:image];
4

5 に答える 5

5

次のようにして、ファイル名の配列を取得し、別の配列に画像自体を入力することができます(それがあなたがやろうとしていたことだと仮定します)。

NSMutableArray *imagePaths = [[NSMutableArray alloc] init];
NSMutableArray *images = [[NSMutableArray alloc] init];

NSArray *imageTypes = [NSArray arrayWithObjects:@"jpg", @"jpeg", @"gif", nil];

// load the imagePaths array

for (NSString *imageType in imageTypes)
{
    NSArray *imagesOfParticularType = [[NSBundle mainBundle]pathsForResourcesOfType:imageType 
                                                                        inDirectory:@"Images"];
    if (imagesOfParticularType)
        [imagePaths addObjectsFromArray:imagesOfParticularType];
}

// load the images array

for (NSString *imagePath in imagePaths)
    [images addObject:[UIImage imageWithContentsOfFile:imagePath]];

余談ですが、これらが小さなサムネイル画像であり、数が非常に少ない場合を除いて、通常、このようにすべての画像を一度に読み込むことはお勧めできません。一般に、画像は大量のRAMを使用する可能性があるため、ファイル名の配列は保持しますが、実際に必要になるまで画像の読み込みを延期します。


画像を正常に取得できない場合は、次の2つの質問があります。

  1. ファイルは私のバンドルに含まれていますか?ターゲットの設定で[ビルドフェーズ]を選択し、[バンドルリソースのコピー]を展開すると(下の画像を参照)、画像が含まれていることがわかりますか?このリストに画像が表示されていない場合は、ビルド時にアプリに含まれません。画像を追加するには、「+」をクリックしてこのリストに追加します。

    ここに画像の説明を入力してください

  2. ファイルは「グループ」にありますか、それとも実際のサブディレクトリにありますか?プロジェクトにファイルを追加すると、次のダイアログが表示されます。

    ここに画像の説明を入力してください

    [追加したフォルダーのフォルダー参照を作成する]を選択した場合、プロジェクトではフォルダーが青色で表示されます(db_images前の画面のスナップショットの["]フォルダーの横にある青いアイコンを参照してください)。ただし、「追加されたフォルダのグループを作成する」を選択した場合は、「Images」グループの横に通常の黄色のアイコンが表示されます。結論として、このシナリオでは、サブディレクトリ " Images"で画像を検索する場合、[追加されたフォルダのフォルダ参照を作成する]オプションを使用して、画像の横に青いアイコンを表示します。

結論として、画像がアプリバンドルに含まれていること、および画像が思いどおりの場所にあることを確認する必要があります。また、iOSでは大文字と小文字が区別されることに注意してください(ただし、シミュレーターでは区別されません)。そのため、「Images」の大文字と小文字を正しく区別してください。

于 2012-12-10T16:08:14.240 に答える
0

私があなたの質問を正しく理解している場合、ドキュメントによると、initWithContentsOfFileはあなたが期待していることをしません:

「指定されたパスで指定されたファイルの内容で、新しく割り当てられた配列を初期化します。」

さらに、pathsForResourceOfTypeは、UIImageではなく、すでに配列を作成しています。次のようにするだけです。

NSArray* images = [[NSBundle mainBundle]pathsForResourcesOfType:@"jpg" @"jpeg" @"gif" inDirectory:@"Images"];
于 2012-12-10T16:05:46.167 に答える
0
[[NSBundle mainBundle]pathsForResourcesOfType:@"jpg" @"jpeg" @"gif" inDirectory:@"Images"];

すでにこれらのオブジェクトの配列を返します。行を次のように変更します。

 NSArray *images = [[NSBundle mainBundle]pathsForResourcesOfType:@"jpg" @"jpeg" @"gif" inDirectory:@"Images"];

この配列は、すべての画像のパスのみを保持することに注意してください。それらの画像を作成するには、電話する必要があります

for(NSString* imagePath in images) {

    UIImage* anImage = [[UIImage alloc] initWithContentsOfFile:imagePath];
    //do something with your image here.
}

お役に立てば幸い

于 2012-12-10T16:08:05.163 に答える
0

initWithContentsOfFileの方法のドキュメントを読んでくださいNSArray

aPathで識別されるファイル内の配列表現には、プロパティリストオブジェクト(NSString、NSData、NSArray、またはNSDictionaryオブジェクト)のみが含まれている必要があります。この配列に含まれるオブジェクトは、配列が可変であっても不変です。

あなたの場合NSFileManager、ディレクトリ内のファイルを列挙するためにを使用する必要があります。ドキュメントからのディレクトリ列挙の例を次に示します。

NSFileManager *localFileManager=[[NSFileManager alloc] init];
NSDirectoryEnumerator *dirEnum =
    [localFileManager enumeratorAtPath:docsDir];

NSString *file;
while (file = [dirEnum nextObject]) {
    if ([[file pathExtension] isEqualToString: @"doc"]) {
        // Create an image object here and add it to 
        // mutable array
    }
}
[localFileManager release];
于 2012-12-10T16:09:07.723 に答える
0

これを試して:

    NSMutableArray* paths=[NSMutableArray new];
    NSFileManager* manager=[NSFileManager new];
    NSBundle* bundle= [NSBundle mainBundle];
    NSDirectoryEnumerator* enumerator= [manager enumeratorAtPath: [bundle bundlePath] ];
    for(NSString* path in enumerator)
    {
        if([path hasSuffix: @".jpg"] || [path hasSuffix: @".jpeg"] || [path hasSuffix: @".gif"])
        {
            [paths addObject: path];
        }
    }

説明については、NSDirectoryEnumeratorのドキュメントを参照することをお勧めします。

于 2012-12-10T16:14:46.613 に答える