在新视图控制器UIImageView中显示图像

时间:2014-05-18 19:22:51

标签: ios uiimageview uiimagepickercontroller

我先发布我的代码,然后我会解释问题

RootViewController.h,它的名字叫SpViewController.h

#import <UIKit/UIKit.h>
#import <MobileCoreServices/MobileCoreServices.h>
#import "secondViewController.h"
@interface spViewController : UIViewController


<UIImagePickerControllerDelegate,
UINavigationControllerDelegate>

@property BOOL newMedia;


@property (strong, nonatomic) IBOutlet UIImageView *imageView;
@property (strong, nonatomic) spViewController *secondViewController;
@property (strong, nonatomic) UIImageView *image;
@property (strong, nonatomic) UIImage *myImage;

- (IBAction)useCamera:(id)sender;


- (IBAction)useCameraRoll:(id)sender;


@end

spViewController.m

   #import "spViewController.h"
#import "secondViewController.h"

@interface spViewController ()

@end

@implementation spViewController

- (IBAction)backtohome:(UIStoryboardSegue *)unwindSegue
{
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
}
- (void) viewDidAppear:(BOOL)animated{
    [super viewDidAppear:animated];
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (IBAction)useCamera:(id)sender {
        if ([UIImagePickerController isSourceTypeAvailable:
             UIImagePickerControllerSourceTypeCamera])
        {
            UIImagePickerController *imagePicker =
            [[UIImagePickerController alloc] init];
            imagePicker.delegate = self;
            imagePicker.sourceType =
            UIImagePickerControllerSourceTypeCamera;
            imagePicker.mediaTypes = @[(NSString *) kUTTypeImage];
            imagePicker.allowsEditing = NO;
            [self presentViewController:imagePicker
                               animated:YES completion:nil];
            _newMedia = YES;
        }
    }

- (IBAction)useCameraRoll:(id)sender {

    if ([UIImagePickerController isSourceTypeAvailable:
         UIImagePickerControllerSourceTypeSavedPhotosAlbum])
    {
        UIImagePickerController *imagePicker =
        [[UIImagePickerController alloc] init];
        imagePicker.delegate = self;
        imagePicker.sourceType =
        UIImagePickerControllerSourceTypePhotoLibrary;
        imagePicker.mediaTypes = @[(NSString *) kUTTypeImage];
        imagePicker.allowsEditing = NO;
        [self presentViewController:imagePicker
                           animated:YES completion:nil];
        _newMedia = NO;
    }
}



//image picker delegate

-(void)imagePickerController:(UIImagePickerController *)picker
didFinishPickingMediaWithInfo:(NSDictionary *)info
{
UIImage *chosenImage = info[UIImagePickerControllerEditedImage]; self.myImage =  chosenImage;

    NSString *mediaType = info[UIImagePickerControllerMediaType];

    [self performSelector:@selector(myMethod:) withObject:info afterDelay:0.1];

    if ([mediaType isEqualToString:(NSString *)kUTTypeImage]) {
        UIImage *image = info[UIImagePickerControllerOriginalImage];

        _imageView.image = image;
        if (_newMedia)
            UIImageWriteToSavedPhotosAlbum(image,
                                           self,
                                           @selector(image:finishedSavingWithError:contextInfo:),
                                           nil);
    }
    else if ([mediaType isEqualToString:(NSString *)kUTTypeMovie])
    {

    }
}

-(void)myMethod:(NSDictionary *)info {
    [self dismissViewControllerAnimated:YES completion:^{
        NSLog(@"Perform segue");
        [self performSegueWithIdentifier:@"Picture Unwind Segue" sender:self];
    }];
}


-(void)image:(UIImage *)image
finishedSavingWithError:(NSError *)error
 contextInfo:(void *)contextInfo
{
    if (error) {
        UIAlertView *alert = [[UIAlertView alloc]
                              initWithTitle: @"Save failed"
                              message: @"Failed to save image"
                              delegate: nil
                              cancelButtonTitle:@"OK"
                              otherButtonTitles:nil];
        [alert show];
    }
}
//cancel delegate

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



 -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([[segue identifier]isEqualToString:@"Picture Unwind Segue"]) {
        secondViewController *destinationViewController = [segue destinationViewController];
        destinationViewController.imageView.image = self.myImage;
    }
}

@end

secondViewController.h

#import <UIKit/UIKit.h>
#import <MobileCoreServices/MobileCoreServices.h>
#import "spViewController.h"

@interface secondViewController : UIViewController

<UIImagePickerControllerDelegate,
UINavigationControllerDelegate>

@property (strong, nonatomic) IBOutlet UIImageView *imageView;
@property (strong, nonatomic) UIImage *myImage;
@property (strong, nonatomic) UIImageView *image;

@end

secondViewController.m

#import "secondViewController.h"
#import "spViewController.h"

@interface secondViewController ()

@end

@implementation secondViewController



- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}



 - (void)viewDidLoad
{
    self.imageView.image = self.myImage;

    [super viewDidLoad];

         }

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

/*
#pragma mark - Navigation

// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    // Get the new view controller using [segue destinationViewController].
    // Pass the selected object to the new view controller.
}
*/

@end

所以我遇到的问题是,我无法将UIImagePickerController中刚刚选中的图片显示在UIImageView中{my} {{1}我以前的视图控制器中的一个按钮启动了&#34; ImagePickerController&#34; (spViewController)我正在使用故事板,我想如果我放入rootViewController然后使用它会在那里显示的插座参考连接它,但事实并非如此。如果我将UIImageView放在第一个视图控制器中并执行相同操作,它将显示图像,但这不是我希望它去的地方。

感谢您的帮助

3 个答案:

答案 0 :(得分:0)

因此,根据您的代码,您正在设置myImage的属性,该属性是来自RootViewController的UIImage实例。

所以你只是传递图像的数据,但是你没有将imageView.image属性设置为传递的图像值。

所以可能的解决方法是设置 imageView.image = myImage

中的viewDidLoad

您可以直接从RootViewController中的perform prepare for segue方法访问imageView属性并设置其image属性。

我希望这会有所帮助。 干杯

答案 1 :(得分:0)

您可以在AppDelegate类中声明一个属性,并使用appdelegate共享实例在所有控制器中访问它

答案 2 :(得分:0)

为了解决我的问题,我决定保存图像并稍后调用它继承我放入我的secondViewController.m的代码

{NSString *docsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
    NSString *filepathJPG = [docsPath stringByAppendingPathComponent:@"imagefile.jpg"];

    UIImage *img = [UIImage imageWithContentsOfFile: filepathJPG];
    if (img != nil) {
        // assign the image to the imageview,
        _imageView.image = img;

        // Optionally adjust the size
        BOOL adjustToSmallSize = YES;
        CGRect smallSize = (CGRect){0,0,100,100};
        if (adjustToSmallSize) {
            _imageView.bounds = smallSize;
        }

    }

我希望这可以帮助那些有同样问题的人。