didFinishPickingMediaWithInfo вернуть ноль фото - PullRequest
30 голосов
/ 22 июня 2010

Я работаю, чтобы захватить изображение, которое возвращается в 4.0, используя

- (void)imagePickerController:(UIImagePickerController *)picker 
    didFinishPickingMediaWithInfo:(NSDictionary *)info
{
    [[picker parentViewController] dismissModalViewControllerAnimated:YES]; 

    // MediaType can be kUTTypeImage or kUTTypeMovie. If it's a movie then you
    // can get the URL to the actual file itself. This example only looks for images.
    //   
    NSString* mediaType = [info objectForKey:UIImagePickerControllerMediaType];
    // NSString* videoUrl = [info objectForKey:UIImagePickerControllerMediaURL];

    // Try getting the edited image first. If it doesn't exist then you get the
    // original image.
    //
    if (CFStringCompare((CFStringRef) mediaType,  kUTTypeImage, 0) == kCFCompareEqualTo) {               
        UIImage* picture = [info objectForKey:UIImagePickerControllerEditedImage];
        if (!picture)
            picture = [info objectForKey:UIImagePickerControllerOriginalImage];             

        // **picture is always nil
            // info dictionary count = 1


    }

}

Что происходит, так это то, что информационный словарь всегда возвращается с одной записью:

{ UIImagePickerControllerMediaType = "Public.image";

это здорово, но изображения никогда не бывает.

Для этого я использовал отличный пример с этого форума, и я почти уверен, что звонки верны, но не изображение.

Заранее спасибо!

Ответы [ 8 ]

54 голосов
/ 16 ноября 2010

Я знаю, что это много месяцев спустя, но я боролся с этим часами и нашел этот же вопрос по всему сайту и на iphonedevsdk.com, но так и не получил рабочего ответа.

Подводя итог, можно сказать, что если изображение было выбрано из рулона камеры / библиотеки фотографий, оно работало нормально, но если изображение было новым снимком, сделанным камерой, оно никогда не работало.Хорошо, вот как заставить это работать для обоих:

Вы должны отклонить и выпустить UIImagePickerController до того, как попытаетесь что-либо сделать с информационным словарем.Чтобы быть супер-четким:

Это НЕ работает:

- (void)imagePickerController:(UIImagePickerController *)picker 
                      didFinishPickingMediaWithInfo:(NSDictionary *)info {

          // No good with the edited image (if you allowed editing)
  myUIImageView.image = [info objectForKey:UIImagePickerControllerEditedImage];
          // AND no good with the original image
  myUIImageView.image = [info objectForKey:UIImagePickerControllerOriginalImage];
          // AND no doing some other kind of assignment
  UIImage *myImage = [info objectForKey:UIImagePickerControllerEditedImage];

  [picker dismissModalViewControllerAnimated:YES];
  [picker release];
}

Во всех этих случаях изображение будет ноль.

Однакочерез магию освобождения UIImagePickerController first ...

Это работает:

- (void)imagePickerController:(UIImagePickerController *)picker 
                      didFinishPickingMediaWithInfo:(NSDictionary *)info {

  [picker dismissModalViewControllerAnimated:YES];
  [picker release];

          // Edited image works great (if you allowed editing)
  myUIImageView.image = [info objectForKey:UIImagePickerControllerEditedImage];
          // AND the original image works great
  myUIImageView.image = [info objectForKey:UIImagePickerControllerOriginalImage];
          // AND do whatever you want with it, (NSDictionary *)info is fine now
  UIImage *myImage = [info objectForKey:UIImagePickerControllerEditedImage];
}

Сумасшедший простой, но это все, что естьэто к нему.

17 голосов
/ 30 ноября 2012

, хотя ответ Мэтью Фредерика является самым популярным и долгое время был подходящим ответом, начиная с iOS 5.0, яблоко стало доступным dismissViewControllerAnimated:completion:, чтобы заменить устаревшую (с iOS 6.0) dismissViewControllerAnimated:.

выполнение поиска по словарю информации об изображении в блоке завершения, надеюсь, будет более понятным для всех.

, чтобы взять его пример сверху, теперь это будет выглядеть так:

- (void)    imagePickerController:(UIImagePickerController *)picker 
    didFinishPickingMediaWithInfo:(NSDictionary *)info 
{
    [picker dismissViewControllerAnimated:YES completion:^{
          // Edited image works great (if you allowed editing)
        myUIImageView.image = [info objectForKey:UIImagePickerControllerEditedImage];
          // AND the original image works great
        myUIImageView.image = [info objectForKey:UIImagePickerControllerOriginalImage];
          // AND do whatever you want with it, (NSDictionary *)info is fine now
        UIImage *myImage = [info objectForKey:UIImagePickerControllerEditedImage];
    }];
}
5 голосов
/ 14 августа 2013

Я пробовал все выше, но безуспешно на симуляторе iPad 6.0 / 6.1, однако я обнаружил, что информация содержит ключ "UIImagePickerControllerReferenceURL" и вот мой код:

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
  [picker dismissViewControllerAnimated:YES completion:NULL];

  UIImage* image = [info objectForKey:UIImagePickerControllerOriginalImage];
  if(NULL == image){
      [MyImageLoader loadImageFromAssertByUrl:[info objectForKey:@"UIImagePickerControllerReferenceURL"]
                                   completion:^(UIImage* img){
                                        //img not null here
                                   }];
  }else{
      //image not null here
  }
}

и код дляloadImageFromAssertByUrl:

+(void) loadImageFromAssertByUrl:(NSURL *)url completion:(void (^)(UIImage*)) completion{
  ALAssetsLibrary *assetLibrary=[[ALAssetsLibrary alloc] init];
  [assetLibrary assetForURL:url resultBlock:^(ALAsset *asset) {
      ALAssetRepresentation *rep = [asset defaultRepresentation];
      Byte *buffer = (Byte*)malloc(rep.size);
      NSUInteger buffered = [rep getBytes:buffer fromOffset:0.0 length:rep.size error:nil];
      NSData *data = [NSData dataWithBytesNoCopy:buffer length:buffered freeWhenDone:YES];
      UIImage* img = [UIImage imageWithData:data];
      completion(img);
  } failureBlock:^(NSError *err) {
      NSLog(@"Error: %@",[err localizedDescription]);
  }];
}
2 голосов
/ 18 января 2013

Существует также известная ошибка с некоторыми версиями XCode и Mountain Lion.Проверьте консоль на наличие этого сообщения:

2013-01-17 21:36:34.946 3sure-ios[5341:1803] Named service 'com.apple.PersistentURLTranslator.Gatekeeper' not found. assetsd is down or misconfigured. Things will not work the way you expect them to.

Возможно, это сообщение не будет работать, если появится это сообщение.Проверьте свое приложение на реальном устройстве iOS.

Тем не менее, перезапуск симулятора и XCode, похоже, решает проблему.

1 голос
/ 25 января 2013

использование

[[UIImagePickerController alloc] init];

вместо

[[UIImagePickerController alloc] initWithNibName:(NSString *) bundle:(NSBundle *)];
0 голосов
/ 16 июня 2014

Необходимо выполнить следующие шаги:1) Сделать UIActionSheet2) При выборе необходимого типа источника - загрузка ресурсов3) didFinishPickingMediaWithInfo - установить изображение из изображения.

    - (IBAction)actionButtonUpload:(id)sender {

             UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:nil delegate:self 

cancelButtonTitle:@"Cancel" destructiveButtonTitle:nil otherButtonTitles:@"Camera",@"Photo Library", nil];

         [actionSheet showInView:self.view];

    }

    #pragma mark -- UIActionSheet Delegate
    -(void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex{

        UIImagePickerController *picker = [[UIImagePickerController alloc] init];

        picker.delegate = self;
        picker.allowsEditing = YES;
        UIAlertView *alert;


        switch (buttonIndex) {
            case 0:
                if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {

                    NSLog(@"No camera!");
                    picker.sourceType = UIImagePickerControllerSourceTypeCamera;
                    [self presentViewController:picker animated:YES completion:NULL];


                } else {

                    alert = [[UIAlertView alloc]initWithTitle:@"Alumnikonnect" message:@"Camera is not available, please select a different media" delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil];

                    [alert show];

                }
                break;
            case 1:

                if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]) {

                    picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
                    [self presentViewController:picker animated:YES completion:NULL];


                } else {

                    alert = [[UIAlertView alloc]initWithTitle:@"Alumnikonnect" message:@"Photolibrary is not available, please select a different media" delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil];

                    [alert show];

                }

                break;

        }

    }


    #pragma mark - Image picker delegate

    - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
    {
          self.imageEventPic.layer.cornerRadius =   self.imageEventPic.frame.size.height /2;
          self.imageEventPic.layer.masksToBounds = YES;
          self.imageEventPic.layer.borderWidth = 0;
          self.imageEventPic.layer.borderWidth = 1.0f;
          self.imageEventPic.layer.borderColor = [UIColor colorWithRed:0.212 green:0.255 blue:0.302 alpha:1.000].CGColor;


        self.labelUploadPic.hidden = YES;

        self.imageEventPic.image =  info[UIImagePickerControllerOriginalImage];

        [self dismissViewControllerAnimated:YES completion:NULL];

    }


    - (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker
    {
        [self dismissViewControllerAnimated:YES completion:NULL];

    }

    -(UIImage*)imageWithImage:(UIImage*)image
                 scaledToSize:(CGSize)newSize;
    {
        UIGraphicsBeginImageContext( newSize );

        [image drawInRect:CGRectMake(0,0,newSize.width,newSize.height)];

        UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();

        UIGraphicsEndImageContext();

        return newImage;

    }
0 голосов
/ 10 апреля 2014
-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info 
{

    [picker dismissViewControllerAnimated:YES completion:NULL];
    //Image picker for nil value 
    UIImage* selectedImage = [info objectForKey:UIImagePickerControllerOriginalImage];
    NSLog(@"my Info :: %@", info);

    if(NULL == selectedImage){
      UIImage * selectedImage =  [PhotoViewController loadImageFromAssertByUrl:[info objectForKey:@"UIImagePickerControllerReferenceURL"]
                                     completion:^(UIImage * selectedImage){
                                         //img not null here
                                         NSLog(@"img2 ::: %@", selectedImage);
                                         uploadImg.image = selectedImage;
                                         [self.view addSubview:PermissionView];
                                     }];
    }else{
        //image not null here
        NSLog(@"Up IMG00 :: %@", uploadImg.image);
        NSLog(@"Sel IMG00 :: %@", selectedImage);
        uploadImg.image = [selectedImage retain];
        NSLog(@"Up IMG22 :: %@", uploadImg.image);
        NSLog(@"Sel IMG22 :: %@", selectedImage);

    }
}


+(UIImage *) loadImageFromAssertByUrl:(NSURL *)url completion:(void (^)(UIImage*)) completion{


    __block UIImage* img;

    ALAssetsLibrary *assetLibrary=[[ALAssetsLibrary alloc] init];

    [assetLibrary assetForURL:url resultBlock:^(ALAsset *asset) {
        ALAssetRepresentation *rep = [asset defaultRepresentation];
        Byte *buffer = (Byte*)malloc(rep.size);
        NSUInteger buffered = [rep getBytes:buffer fromOffset:0.0 length:rep.size error:nil];
        NSData *data = [NSData dataWithBytesNoCopy:buffer length:buffered freeWhenDone:YES];
        img = [UIImage imageWithData:data];
        completion(img);
        NSLog(@"img ::: %@", img);
    } failureBlock:^(NSError *err) {
        NSLog(@"Error: %@",[err localizedDescription]);
    }];

    return img;
}
0 голосов
/ 05 апреля 2012

У меня были те же симптомы, но в моем случае оказалось, что у меня есть категория в иерархии UIImagePickerController, которая переопределяет "uuid" или "setUUID"? Я предполагаю, что CoreData нужны эти методы, или он очень, очень запутан, а библиотека ресурсов - это все, что связано с CoreData.

...