У меня есть приложение, которое добавляет представление, которое используется для вызова UIImagePickerController.Когда пользователь нажимает кнопку добавления изображения, выполняется следующий код:
'- (IBAction) addPhoto: (id) отправитель {
// Call background tap in case any keyboards are still up
[self backgroundTap:sender];
if (jpegData) {
// If we already chose an image, don't allow to choose another.
// Have to cancel out and come back!
return;
}
// Shows the photo picker so the user can take or select an image
photoPickerViewController = [[PhotoPickerViewController alloc] initWithNibName:@"PhotoPicker" bundle:nil];
photoPickerViewController.delegate = self;
// Add it to the subview - it will auto animate in/out
[self.view addSubview:photoPickerViewController.view];
}
Это представляетпользователь с созданным мною представлением имеет 3 кнопки: сделать фотографию, выбрать существующую фотографию и отменить.Отмена просто отменяет возврат к основному виду.Если снимать фотографию или выбрать существующий, этот код выполняется:
'- (IBAction) choosePhoto: (id) отправитель {
// Show an image picker to allow the user to choose a new photo.
UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];
imagePicker.delegate = self;
if((UIButton*)sender == chooseExistingButton) {
imagePicker.sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum;
} else {
imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;
imagePicker.showsCameraControls = YES;
}
[self presentModalViewController:imagePicker animated:YES];
[imagePicker release];
}
Когда, еслипользователь отменяет выбор изображения, мы возвращаемся к основному виду.Нет проблем.Однако, если они завершают выбор изображения (либо путем фотографирования, либо путем выбора существующего), тогда мы вызываем:
'- (void) imagePickerController: (UIImagePickerController *) picker didFinishPickingMediaWithInfo: (NSDictionary *) info {
// Ok, dismiss the modal picker, bring up the activity indicator and dispatch a thread
// that will do all the photo processing ...
BOOL isFromCamera = picker.sourceType == UIImagePickerControllerSourceTypeCamera;
// Dismiss the picker view controller
[picker dismissModalViewControllerAnimated:NO];
// And remove our view from the list of views
[self.view removeFromSuperview];
if (isFromCamera)
{
// Declare the completion block to use
ALAssetsLibraryWriteImageCompletionBlock compBlock = ^(NSURL *assetURL, NSError *error) {
if (error != nil || assetURL == nil) {
NSLog(@"Failed to save photo: %@", error);
[delegate photoSetURLForImage:nil];
}
else {
NSLog(@"URL is : %@", [assetURL absoluteString]);
[delegate photoSetURLForImage:assetURL];
}
};
ALAssetsLibrary* library = [[[ALAssetsLibrary alloc] init] autorelease];
[library writeImageToSavedPhotosAlbum:cgimage
metadata:meta
completionBlock:compBlock];
return;
}
else {
// Use the URL to get the metadata for the image that was picked ...
NSURL* url = [(NSDictionary*)info objectForKey:@"UIImagePickerControllerReferenceURL"];
if (url) {
// Define a result and failure block for fetching from the ALAsset
ALAssetsLibraryAssetForURLResultBlock resultblock = ^(ALAsset* myasset)
{
ALAssetRepresentation *rep = [myasset defaultRepresentation];
NSLog(@"URL is : %@", [[rep url] absoluteString]);
[delegate photoSetURLForImage:[rep url]];
};
// And also define a failure block
ALAssetsLibraryAccessFailureBlock failureblock = ^(NSError *myerror)
{
[delegate photoSetURLForImage:nil];
};
ALAssetsLibrary* assetslibrary = [[[ALAssetsLibrary alloc] init] autorelease];
[assetslibrary assetForURL:url
resultBlock:resultblock
failureBlock:failureblock];
return;
}
}
// If we get here, something went very wrong
UIAlertView *alert = [[[UIAlertView alloc] initWithTitle:@"Error" message:@"An error occured while retrieving the image" delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil] autorelease];
[alert show];
}
Теперь, когда я впервые запускаю этот код, все прекрасно работает.Как только я нажимаю «использовать» на снимке, который я сделал камерой, или я выбираю изображение из рулона камеры, представление UIImagePicker и представление, которое его запускает, исчезают, и я возвращаюсь к основному виду, пока я ждудля звонков ALAsset делать свое дело.
Проблема начинается, когда я пытаюсь повторить этот процесс во второй раз.После выбора изображения или его получения начинается обработка, но представления не исчезают, пока не будет завершена вся обработка вызовами ALAsset.Я не могу понять, почему это так.Почему это работает в первый раз, а не в любое время после.Есть ли какой-то механизм кеширования, который я должен очистить?В любом случае, если кто-нибудь может предложить какой-то совет, я был бы очень благодарен.
Спасибо,
J