2012-06-12 31 views
6

Tôi đang sử dụng UIImagePickerController để cho phép người dùng chọn hình ảnh từ thư viện hình ảnh. Sau đó tôi muốn bắt đầu vị trí của tập tin đó trong một cơ sở dữ liệu sqlite để tôi có thể tham khảo nó sau này.Đang tải UIImage từ UIImagePickerControllerReferenceURL

Tôi đã thực hiện một số giải thích về cách thực hiện việc này và tôi sắp lên khá ngắn. Tôi biết tôi có thể nhận được ReferenceURL của mặt hàng đó bằng cách gọi bên trong phương pháp đại biểu:

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

này cho tôi một đối tượng NSURL hợp lệ và nếu tôi đầu ra picURL.absoluteString tôi những gì có thể dường như là một url hợp lệ đến vị trí thư viện tài sản của tệp. Tuy nhiên, nếu tôi cố gắng tạo một đối tượng NSData với url này để tôi có thể lần lượt tạo một UIImage, mã không thành công vì NSData trả về nil. Ví dụ:

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

Tôi nhận ra tôi là hơi lặp đi lặp lại ở đây nhưng điểm mấu chốt là để lấy một chuỗi đại diện của URL mà tôi có thể lưu trữ trong SQLite và sau đó sử dụng cho biết chuỗi sau để tạo ra một hình ảnh (vì vậy ở trên mã đại diện cho đào tạo của tư tưởng).

Tôi tìm thấy một số thông tin nổi xung quanh về việc sử dụng ALAssetsLibrary nhưng điều đó đã cho tôi tất cả các loại phù hợp vì nó không xuất hiện để chơi tốt đẹp với iOS 5 và ARC. Tôi tiếp tục nhận được thông báo lỗi 'Kiểu nhận ALAsset cho thông điệp mẫu là một tờ khai chuyển tiếp. Tôi có thể thiết lập các thuộc tính trên tập tin tham chiếu ALAsset/ALAssetsLibrary để bỏ qua ARC để dừng lỗi xây dựng nhưng sau đó ngay khi tôi rời khỏi khối mã, dữ liệu biến mất. Xem dưới đây:

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 không trả lại một hình ảnh hợp lệ nhưng ngay sau khi mã thoát các resultBlock các nội dung của dữ liệu đã mất hết (ví dụ: returnValue trở nên rỗng một lần nữa). Vì vậy, câu hỏi của tôi là: làm cách nào để sử dụng UIImagePickerControllerReferenceURL và chuyển đổi nó thành chuỗi mà tôi có thể lưu trữ trong sqlite và sau đó sử dụng chuỗi đã cho biết để tạo đối tượng UIImage hợp lệ sau này?

+0

Bạn có gặp bất kỳ đâu với thsi không? –

Trả lời

9

Có vẻ như bạn đang đi đúng hướng, để lưu url nội dung.

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


Reload AssetURL 
NSURL asssetURL = [NSURL URLWithString:stringUrl] 

Để tải nội dung sau này, tôi sẽ dựa trên giả định bạn không sử dụng cung. Mà sẽ giải thích lý do tại sao bạn returnValue là số không.

Bạn đã thử thêm phần giữ lại vào kết quả chưa? ví dụ:

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]; 
Các vấn đề liên quan