0

iPhone アプリ プロジェクトにいくつかの png ファイルがあります。シミュレーター用にビルドすると、正常に動作します。しかし、デバイス用にビルドすると、突然、すべての png ファイルが恐ろしい「そんなもの.png pngcrush で libpng エラーをキャッチしました: ... ファイルが見つかりませんでした: ...」という恐ろしいメッセージが生成されます。

私が言うように、シミュレーターを使用すると、すべてがうまく構築され、実行されます。エラーが発生するのは、デバイス用にビルドするようにスキームを変更したときだけです。

クリーニングと再構築を試みました。

Products ディレクトリを手動で削除しようとしました。

システムを再起動してみました。

別のプロジェクトでファイルを使用してみました (同じ結果が得られました)。

私が見つけた唯一のことは、ファイルを開いて再保存することです。ただし、何百もの PNG ファイルがすべてこの問題に悩まされているため、これは最適な解決策とは言えません。問題が何であるかを理解して、直接修正できるようにしたいと思います。

何か案は?

4

2 に答える 2

0

この問題を回避するには、再帰的な再帰的なファイル リセーバーを作成します。プロジェクト ディレクトリに対してこれを実行するだけで、表示されていた 459 エラーが修正されることを確認しました。誰にでも役立つ場合に備えて、関連するコードを次に示します。

- (IBAction) btnGo_Pressed:(id) sender {
    // The path to search is specified by the user
    NSString *path = self.txtPathToSearch.stringValue;

    // Recursively find all files within it
    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSArray *subpaths = [fileManager subpathsOfDirectoryAtPath:path error:nil];

    // Look for pngs
    int totalImagesResaved = 0;
    for (int j=0; j<[subpaths count]; j++) {

        NSString *fullPath = [path stringByAppendingPathComponent:[subpaths objectAtIndex:j]];

        // See if this path ends with a ".png"
        if ([fullPath compare:@".png" options:NSCaseInsensitiveSearch range:NSMakeRange([fullPath length] - 4, 4)] == NSOrderedSame) {

            // Got one. Now resave it as a png
            NSImage *image = [[NSImage alloc] initWithContentsOfFile:fullPath];
            [self saveImage:image asPngWithPath:fullPath];
            totalImagesResaved++;
        }
    }

    // Status report
    NSAlert *alert = [NSAlert alertWithMessageText:@"Done" defaultButton:@"OK" alternateButton:nil otherButton:nil informativeTextWithFormat:@"Encountened %li paths. Resaved %i .pngs.", (unsigned long)[subpaths count], totalImagesResaved];
    [alert runModal];
}

- (void) saveImage:(NSImage *) image asPngWithPath:(NSString *) path
{
    // Cache the reduced image
    NSData *imageData = [image TIFFRepresentation];
    NSBitmapImageRep *imageRep = [NSBitmapImageRep imageRepWithData:imageData];
    imageData = [imageRep representationUsingType:NSPNGFileType properties:nil];
    [imageData writeToFile:path atomically:YES];
}
于 2013-06-13T17:18:27.027 に答える