6

UIImagePickerControllerを使用して、ユーザーが画像ライブラリから画像を選択できるようにしています。次に、後で参照できるように、sqliteデータベースでそのファイルの場所を開始します。

私はこれを行う方法についていくつかのグーグルを行ってきました、そして私はかなり不足しています。デリゲートメソッド内を呼び出すことで、アイテムのReferenceURLを取得できることを知っています。

    NSURL *picURL = [info objectForKey:@"UIImagePickerControllerReferenceURL"]

これにより、有効なNSURLオブジェクトが得られ、picURL.absoluteStringを出力すると、ファイルのアセットライブラリの場所への有効なURLのように見えるものを取得できます。ただし、このURLを使用してNSDataオブジェクトを作成し、UIImageを作成しようとすると、NSDataがnilを返すため、コードが失敗します。例えば:

    NSURL *picURL = [info objectForKey:@"UIImagePickerControllerReferenceURL"]
    NSString *stringUrl = picURL.absoluteString;
    NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:stringUrl]];
    imgMain.image = [UIImage imageWithData:data]

ここでは少し繰り返していることに気づきましたが、重要なのは、sqliteに保存できるURLの文字列表現を取得し、後でその文字列を使用して画像を作成することです(したがって、上記のコードはその一連の思考を表しています)。

ALAssetsLibraryの使用についていくつかの情報が浮かんでいるのを見つけましたが、iOS 5とARCではうまく機能しないように見えるため、あらゆる種類の適合が得られました。エラーメッセージが表示され続ける'インスタンスメッセージの受信者タイプALAssetは前方宣言です。ALAsset / ALAssetsLibraryを参照するファイルにプロパティを設定して、ビルドエラーを停止するARCを無視することができますが、コードブロックを離れるとすぐにデータが消えます。下記参照:

    NSURL *referenceURL = [info objectForKey:UIImagePickerControllerReferenceURL];
    ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
    __block UIImage *returnValue = nil;
    [library assetForURL:referenceURL resultBlock:^(ALAsset *asset) {
        returnValue = [UIImage imageWithCGImage:[[asset defaultRepresentation] fullResolutionImage]];
    } failureBlock:^(NSError *error) {
       // error handling
    }];
    [library release];

returnValueは有効な画像を返しますが、コードがresultBlockを終了するとすぐに、データの内容が失われます(つまり、returnValueは再びnullになります)。

だから私の質問は:UIImagePickerControllerReferenceURLを使用してそれをsqliteに保存できる文字列に変換し、後でその文字列を使用して有効なUIImageオブジェクトを作成するにはどうすればよいですか?

4

1 に答える 1

9

アセット URL を保存するために、正しい軌道に乗っているようです。

Save
NSURL *picURL = [info objectForKey:@"UIImagePickerControllerReferenceURL"]
NSString *stringUrl = picURL.absoluteString;


Reload AssetURL
NSURL asssetURL = [NSURL URLWithString:stringUrl]

後でアセットをロードすることに関しては、arc を使用していないという仮定に基づいています。returnValue が nil である理由を説明します。

結果に保持を追加しようとしましたか? 例えば:

    NSURL *referenceURL = [NSURL URLWithString:savedAssetURLString]
    ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
    __block UIImage *returnValue = nil;
    [library assetForURL:referenceURL resultBlock:^(ALAsset *asset) {
        returnValue = [[UIImage imageWithCGImage:[[asset defaultRepresentation] fullResolutionImage]] retain]; //Retain Added
    } failureBlock:^(NSError *error) {
       // error handling
    }];
    [library release];
于 2012-11-07T19:20:08.107 に答える