2017-02-27 5 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を読み込むとnilなので、最初に画像データを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]; 
     } 
    }]; 
} 
関連する問題