2

画像を含むフォルダーを Xcode プロジェクトにドラッグ アンド ドロップするアプリに取り組んでいます。

アプリが起動すると、アプリ内の画像のすべてのファイル名を収集して、後で遅延ロードします。

-(NSArray *)fetchImagesInFolder:(NSString *)folderName{

    NSArray *allImagesArray = [NSArray arrayWithArray:[[NSBundle mainBundle] pathsForResourcesOfType:nil inDirectory:folderName]];

    if([allImagesArray count] == 0){
        NSLog(@"No images found in %@", folderName);
        return nil;
    }

    return allImagesArray;
}

ここに私の問題があります: これは 1 回のタイムアウト 4 でしか機能しません。4 回のうち 3 回[allImagesArray count]は 0 です。

次に、プロジェクトからフォルダーを削除し、もう一度ドラッグ アンド ドロップする必要があります。以前に「追加されたフォルダーのグループを作成する」を選択した場合は、「追加されたフォルダーのフォルダー参照を作成する」を選択し、その逆も同様です。 、実行します。そのソリューションは 4 回中 3 回機能します。

プロジェクトが生成する .app ファイルを右クリックし、[パッケージの内容を表示] をクリックすると、画像が常に表示されます。しかし、なぜpathsForResourcesOfType:inDirectory:それほど信頼できないのでしょうか?

4

2 に答える 2

3

ターゲットのビルド フェーズの「バンドル リソースのコピー」セクションを見て、システムがどのようにイメージをバンドルに移動しているかを確認しましたか? フォルダー自体をコピーするのではなく、さまざまな画像を共通のディレクトリに移動するだけだと思います。

その場合、すべて 'jpg' またはすべて 'png' があると仮定して、適切な接尾辞 (たとえば 'jpg') を取得し、次のようにします。

[NSBundle mainBundle] pathsForResourcesOfType:@"jpg" inDirectory:nil];

実際に Xcode が実際にバンドル内にディレクトリを作成することを確信している場合は、今行っているように名前を追加しますが、タイプはそのままにしておきます。

画像タイプが混在している場合は、上記のコマンドを毎回 1 回実行してから、配列をスーパー配列に結合します。

編集: 画像をさまざまなフォルダーに保存したい場合は、「スクリプトの実行」シェルスクリプトを記述して、必要なことを行う必要があると思います。私はこの手法を自分で行ったことはありませんが、他の人が同じ問題で行っていることだと思います。

  • ターゲットに画像を含めないでください (すべてのチェックを外します) - 自分で管理します
  • 1 つのイメージ (いくつかの jpeg) を追加し、[バンドル リソースのコピー] がそれをどこに移動するかを確認します。メインバンドルディレクトリに移動したことを思い出しますが、やはりわかりません。
  • 空の実行スクリプトを作成し、ボックスをチェックして環境をダンプします。さまざまな定義がすべて表示され、適切なディレクトリを指すものを見つけることができます (スクリプトで使用できます)。
  • 上記を使用して、最上位のプロジェクト ディレクトリを指す変数を見つけて、イメージ フォルダーに移動できるようにします。
  • 次に、変数を使用して実行スクリプトをコーディングし、プロジェクト内のすべての画像フォルダーを見つけて、それらを基本的にアプリ バンドル内の適切な場所にコピーします。シミュレーターと実際のアプリではパスが異なるため、変数を使用します。

「Run Scripts」の記述例は、ここと Web にあります。これらの Xcode 環境変数のどれを使用すればよいか思い出せないので、常にセットをダンプしてから探し回ります。任意の名前で、それをグーグルで調べて、それに関する詳細情報を提供するAppleドキュメントを見つけることができます.

于 2012-09-11T11:53:50.667 に答える
1

問題は、フォルダを追加するときに[追加したフォルダのフォルダ参照を作成する]を選択し、を介して画像にアクセスしようとしたことでした。

    UIImage *img = [UIImage imageWithContentsOfFile:[NSString stringWithFormat:@"%@/%@", 
                                                      [[NSBundle mainBundle] resourcePath], imageName]];

ただし、これは、イメージが.appのルートディレクトリにある場合にのみ機能します。これは、[追加されたフォルダーのグループを作成する]を選択した場合に発生します。

私の場合、元のディレクトリ構造を保持したかったので、指定したパラメータに画像へのパスを含めることで問題を解決しましたimageWithContentsOfFile

    NSString *imageName = [NSString stringWithFormat:@"%@", [NSString stringWithFormat:@"name-of-my-images-rootdirectory/%@/%@", [NSString stringWithFormat:@"%@", subdirectoryName], [normalImagesArray objectAtIndex:i]]];
    UIImage *img = [UIImage imageWithContentsOfFile:[NSString stringWithFormat:@"%@/%@", [[NSBundle mainBundle] resourcePath], imageName]];
于 2012-09-11T17:17:55.673 に答える