2015-12-29 55 views
1

我想做一个简单的“配置文件”视图,允许用户更改他的图片。图像选择器会成功加载图库,然后选择新图像,然后将其写入文档目录以在下次启动时加载它,问题是imageview不会使用新图像进行刷新,直到我退出应用程序并重新启动(仅viewDidLoad有效但viewWillAppear正在加载旧图像,虽然它被覆盖!)任何想法?UIImageView没有更新图像

import UIKit 

class Profile: UIViewController,UIImagePickerControllerDelegate,UINavigationControllerDelegate { 

var imagePicker:UIImagePickerController=UIImagePickerController() 
var pickedImage:UIImage? 

let filemgr = NSFileManager.defaultManager() 

@IBOutlet weak var profilepic: UIImageView! 
@IBOutlet weak var lblheight: UILabel! 
@IBOutlet weak var lblwidth: UILabel! 



override func viewDidLoad() { 
    super.viewDidLoad() 
    profilepic.layer.borderWidth=1 
    profilepic.layer.borderColor=UIColor.blackColor().CGColor 

    let tapGestureRecognizer = UITapGestureRecognizer(target:self, action:Selector("imageTapped:")) 
    profilepic.userInteractionEnabled = true 
    profilepic.addGestureRecognizer(tapGestureRecognizer) 
    imagePicker.delegate=self 


    if profileImageExists() 
    { 
     pickedImage=UIImage(named: Operations.getDocumentsDirectory().stringByAppendingPathComponent("profile.png"))! 

    } else { 
     pickedImage=UIImage(named:"camera.png")! 
    } 

    profilepic.image=pickedImage 



} 






func imageTapped(img: AnyObject) 
{ 
     imagePicker.allowsEditing = false 
     imagePicker.sourceType = .PhotoLibrary 
     presentViewController(imagePicker, animated: true, completion: 
      { 
       self.lblheight.text="completed" 
       print ("completed image tab") 
      } 
    ) 
} 


override func viewWillAppear(animated: Bool) { 
pickedImage=UIImage(named:   Operations.getDocumentsDirectory().stringByAppendingPathComponent("profile.png"))! 
    profilepic.image=pickedImage 



} 


// MARK: - UIImagePickerControllerDelegate Methods 

func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) { 
    if let pickedImage = info[UIImagePickerControllerOriginalImage] as? UIImage { 
     profilepic.contentMode = .ScaleToFill 

     profilepic.image = pickedImage 



      if let data = UIImagePNGRepresentation(pickedImage) { 
       let filename = Operations.getDocumentsDirectory().stringByAppendingPathComponent("profile.png") 



       data.writeToFile(filename, atomically: true) 

          } 


    } 

    dismissViewControllerAnimated(true, completion: nil) 
} 



func profileImageExists() -> Bool 
{ 

    if let profileImage=UIImage(named: Operations.getDocumentsDirectory().stringByAppendingPathComponent("profile.png")) 
    { 
     return true 
    } 
    else 
    { 
    return false 

    } 

} 




} 
+0

所以当你从选择器中选择图像,并解雇它,imageview没有加载新的图像? –

+0

不,旧图像仍然显示,但是当我关闭应用程序并重新打开它时,新图像正确显示 –

+0

这就是我所说的,在您关闭选取器后,imageview没有显示新图像。我对么 ? –

回答

3

使用init(named:)加载UIImage缓存图像。所以只要图像名称不改变或系统正在清空缓存(例如,当您重新启动应用程序时),图像将从缓存中使用并且不会再次加载。

尝试使用init(contentsOfFile:)来代替加载图像。

+0

完美,非常感谢你刚刚救了我的一天:) –

0

尝试更新您的imagePickerController方法。你已经使用了pickImage作为一个实例变量和一个本地可选变量。我已经使用newImage代替。

func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) { 
    if let newImage = info[UIImagePickerControllerOriginalImage] as? UIImage { 
     profilepic.contentMode = .ScaleToFill 
     profilepic.image = newImage 
     pickedImage = newImage 


     if let data = UIImagePNGRepresentation(newImage) { 
       let filename = Operations.getDocumentsDirectory().stringByAppendingPathComponent("profile.png") 
       data.writeToFile(filename, atomically: true) 

     } 
    } 

    dismissViewControllerAnimated(true, completion: nil) 
}