【问题标题】:Data passing of photo taken in AppApp中拍摄的照片的数据传递
【发布时间】:2013-07-18 01:49:06
【问题描述】:

我使用了代码

  -(IBAction)TakePhoto {
picker = [[UIImagePickerController alloc]init];
picker.delegate = self;
[picker setSourceType:UIImagePickerControllerSourceTypeCamera];
[self presentViewController:picker animated:YES completion:nil];
[self performSegueWithIdentifier:@"CropImage" sender:sender];
}


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

//obtaining saving path
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *imagePath = [documentsDirectory stringByAppendingPathComponent:@"latest_photo.png"];

//extracting image from the picker and saving it
NSString *mediaType = [info objectForKey:UIImagePickerControllerMediaType];
if ([mediaType isEqualToString:@"public.image"]){
    UIImage *editedImage = [info objectForKey:UIImagePickerControllerEditedImage];
    NSData *webData = UIImagePNGRepresentation(editedImage);
    [webData writeToFile:imagePath atomically:YES];
}
}
- (void)imagePickerControllerDidCancel  :(UIImagePickerController *)picker {
[self dismissViewControllerAnimated:YES completion:NULL];

}

 - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if([segue.identifier isEqualToString:@"CropImage"])
{
    CropImageViewController *cropImageViewController = segue.destinationViewController;
    cropImageViewController.theImage = yourImage;
    // Similar to [segue.destinationViewController setTheImage:yourImage];
    }
 }

我在使用情节提要时遇到了问题。我在情节提要中有多个视图控制器。我在第一个视图控制器上有相机按钮(用户可以在应用程序中拍照)。但是,我想将用户在第一个视图控制器中拍摄的照片数据自动传递给另一个视图控制器,以便用户可以裁剪它,然后将其保存到“目录或其他东西”中(尚未决定)。

更新 我现在有四个错误,目前正在说 http://tinypic.com/view.php?pic=15q6y3b&s=5 点击图片会变大

【问题讨论】:

  • 那么问题出在哪里?不知道怎么传递数据或者不知道怎么调用下一个视图?
  • 对不起,我不知道如何传递数据(照片)

标签: ios image camera


【解决方案1】:

实际上,您不必将照片直接传递到下一个视图,因为您已经保存了它。您可以简单地从目标视图控制器中的同一文件中读回图像。 (如果视图控制器彼此不靠近,这种方法会更好。)

+ (UIImage *)readImageFromFile:(NSString *)name
{
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *imagePath = [documentsDirectory stringByAppendingPathComponent:@"latest_photo.png"];

    NSData *imageData = [NSData dataWithContentsOfFile:imagePath];
    return [UIImage imageWithData:imageData];
}

更新:您也可以使用属性传递照片。

在您的目标视图控制器(我将其命名为 CropImageViewController)中,在 .h 中,

@property (nonatomic, retain) UIImage *theImage;

在页面顶部的“getPhoto”视图控制器中,

#import "CropImageViewController.h"

在 imagePickerController 中,

- (void) imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info 
{
    ...
    // This line should be
    [self performSegueWithIdentifier:@"CropImage" sender:self];
}

在prepareForSegue方法中:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if([segue.identifier isEqualToString:@"CropImage"])
    {
        CropImageViewController *cropImageViewController = segue.destinationViewController;
        cropImageViewController.theImage = yourImage;
        // Similar to [segue.destinationViewController setTheImage:yourImage];
    }
}

确保您设置了一个名称,例如“CropImage”,用于故事板中的 segue 标识符。

【讨论】:

  • 我想使用该属性做第二个。我希望用户拍照,然后该照片转到另一个视图控制器,用户可以在其中裁剪然后保存。因此,如果我使用第一个,它会在发送到裁剪视图控制器仪式之前自动保存?
  • 第一个解决方案是基于您已经完成的,我只是扩展了该方法。既然你更喜欢第二种方法,那么问题解决了吗?
  • 我没有得到第二个代码 [segue.destinationViewController setTheImage:yourImage];我在cropview 控制器中编写了@property 代码。我在哪里写第二个代码?
  • 在获取照片的视图控制器中编写第二个代码。另外,如果有,请在 prepareForSegue 方法中显示代码。
  • 我对三个错误感到困惑,我在问题中编辑了我的代码,你能看一下吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多