2017-02-27 29 views
0

我想更新Viewcontroller上的圖像,我正在使用ImagePickerController,我可以看到chosenImage有數據,我分配它。當圖像被選擇,然後這viewcontroller再次加載,我可以進行調試,看看它是否擊中loadUserProfile方法,是的。但UIImage正在某處以某種方式獲得零。UIImage從UIImagePickerController獲得零

@property (strong, nonatomic) UIImage *userPicImage; 
@property (weak, nonatomic) IBOutlet UIImageView *userProfileImage; 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    [self loadUserProfile]; 
} 

-(void)loadUserProfile 
{ 
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
    NSString * userImageURL = [defaults objectForKey:@"imageURL"];  
    bool isReload = [defaults boolForKey:@"isReload"]; 

    if(isReload) 
    { 
     //self.userPicImage is always nil 
     [self.userProfileImage setImage:self.userPicImage]; 
     [defaults setBool:false forKey:@"comingBack"]; 
     [defaults synchronize]; 
    } 
} 

- (void)imagePickerController:(UIImagePickerController *)picker 
didFinishPickingMediaWithInfo:(NSDictionary *)info { 
    UIImagePickerControllerSourceType source = [UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera] ? UIImagePickerControllerSourceTypeCamera : UIImagePickerControllerSourceTypeSavedPhotosAlbum; 

    UIImage *chosenImage = info[UIImagePickerControllerEditedImage]; 
    // userPicImage is not nil here! 
    self.userPicImage = chosenImage; 

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
    [defaults setBool:true forKey:@"isReload"]; 
    [defaults synchronize]; 

    [picker dismissViewControllerAnimated:YES completion:^{   
     if (source == UIImagePickerControllerSourceTypeCamera) { 
      [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationNone]; 
     } 
    }]; 
} 
+0

嗯,你是否檢查'didFinishPickingMediaWithInfo'中的'self'和'loadUserProfile'是否是相同的地址? – nynohu

+0

檢查這篇文章,並根據您的要求修改代碼。 http://www.theappguruz.com/blog/ios-image-picker-controller –

回答

0
  • 每當viewdidloadviewcontroller加載爲一個新的reference,所有的參考網點和變量被設置爲新的。在你的情況下,userPicImage作爲新對象啓動,因此邏輯上不會有任何內容。
  • 您最好將您的圖像數據存儲在userdefaults中,並從那裏檢索它。
1

請嘗試此代碼,因爲當您再次加載vc時,圖像數據爲零,所以請先將圖像數據轉換爲base64string。

@property (strong, nonatomic) UIImage *userPicImage; 
@property (weak, nonatomic) IBOutlet UIImageView *userProfileImage; 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    [self loadUserProfile]; 
} 

-(void)loadUserProfile 
{ 
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
    NSString * userImageURL = [defaults objectForKey:@"imageURL"]; 
    bool isReload = [defaults boolForKey:@"isReload"]; 

    if(isReload) 
    { 
     //self.userPicImage is always nil 
     NSString *base64String=[defaults stringForKey:@"chosenimage"]; 
     NSData* data = [[NSData alloc] initWithBase64EncodedString:base64String options:0]; 
     UIImage* image = [UIImage imageWithData:data]; 
     self.userProfileImage.image=image; 
     // [self.userProfileImage setImage:self.userPicImage]; 
     [defaults setBool:false forKey:@"comingBack"]; 
     [defaults synchronize]; 
    } 
} 

- (void)imagePickerController:(UIImagePickerController *)picker 
didFinishPickingMediaWithInfo:(NSDictionary *)info { 
    UIImagePickerControllerSourceType source = [UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera] ? UIImagePickerControllerSourceTypeCamera : UIImagePickerControllerSourceTypeSavedPhotosAlbum; 

    UIImage *chosenImage = info[UIImagePickerControllerEditedImage]; 
    // userPicImage is not nil here! 
    self.userPicImage = chosenImage; 
    NSData *imageData = UIImageJPEGRepresentation(chosenImage, 1.0); 
    NSString *encodedString = [imageData base64Encoding]; 

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
    [defaults setObject:encodedString forKey:@"chosenimage"]; 
    [defaults setBool:true forKey:@"isReload"]; 
    [defaults synchronize]; 

    [picker dismissViewControllerAnimated:YES completion:^{ 
     if (source == UIImagePickerControllerSourceTypeCamera) { 
      [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationNone]; 
     } 
    }]; 
}