2012-06-12 13 views
6

Kullanıcıların görüntü kitaplığından bir görüntü seçmesine izin vermek için bir UIImagePickerController kullanıyorum. Daha sonra bu dosyanın konumunu bir sqlite veritabanında başlatmak istiyorum, böylece daha sonra başvurabilirim.Yükleme UIImage UIImagePickerControllerReferenceURL

Bunu nasıl yapacağım hakkında biraz araştırma yapıyorum ve oldukça kısayım.

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

Bu bana geçerli bir NSURL nesnesi veriyor ve ben çıkış picURL.absoluteString eğer geçerli bir URL gibi görünen ne: Ben temsilci yönteminin içine arayarak öğenin ReferenceURL alabilirsiniz biliyorum dosyanın varlık kütüphanesi konumu. Ancak, bu url ile bir NSData nesnesi oluşturmaya çalışırsanız, bu nedenle bir UIImage oluşturabilirim, NSData nil döndürdüğü için kod başarısız olur. Örneğin:

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

Buraya biraz tekrarlayan oluyorum farkında ama mesele o zaman sqlite depolamak ve URL'ye bir dize temsilini kapmak için kullanım (böylece bir görüntü yaratmak için dize sonra sözü Yukarıdaki kod, düşünce trenini temsil eder).

ALAssetsLibrary kullanarak etrafta dolaşan bazı bilgiler buldum, ancak bu bana iOS 5 ve ARC ile hoş görünmediği için her tür uyumu sağladı. Hata mesajlarını almaya devam ediyorum 'Alıcı tipi ALAsset örneğin mesaj ileriye dönük bir beyandır. Dosyadaki özellikleri yapı hatalarını durduran ARC'yi yok saymak için ALAsset/ALAssetsLibrary 'e referansta bulabilirim ancak kod bloğundan çıktığı anda veri kaybolur. Aşağıya bakın:

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 geçerli bir resim çıkmıyor ama en kısa kod verilerinin içerikleri gitti resultBlock çıkarken (yani returnValue yine boş olur).

Bu yüzden sorum şu: UIImagePickerControllerReferenceURL aracını nasıl kullanırım ve sqlite'de depolayabildiğim bir dizeye dönüştürür ve daha sonra geçerli bir UIImage nesnesi oluşturmak için adı geçen dizeyi kullanabilir miyim?

+0

Thsi ile herhangi bir yere gittiniz mi? –

cevap

9

Varlık URL'sini kaydetmek için doğru yoldasınız gibi görünüyor. daha sonra varlığı yükleme gelince

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


Reload AssetURL 
NSURL asssetURL = [NSURL URLWithString:stringUrl] 

, sana yayı kullanmadığınız varsayımına dayandırmak için gidiyorum. Hangi neden dönüş yaptığınızı açıklar.

Sonuç için bir koruma eklemeyi denediniz mi? örneğin:

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];