通过委托传递 class : 属性 未更新

Passing class via delegate : property not updated

不明白为什么我的 class 属性 没有更新(图像数据 属性)。

简单示例,导航控制器中嵌入了 2 个视图控制器(对我来说很重要):

第一个:ViewController 带有 imageView 和第二个视图控制器的按钮(通过 segue)

class ViewController: UIViewController, choosePicVCDelegate {

  @IBOutlet weak var imageView: UIImageView!

  override func viewDidLoad() {
    super.viewDidLoad()
    self.imageView.clipsToBounds = true    
  }

  func goodPic(vc: choosePicViewController) {

    if let data = vc.imageData {
      let image = UIImage(data: data)
      self.imageView.image = image
    }
    vc.navigationController?.popViewControllerAnimated(true)
  }

  override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    let vc = segue.destinationViewController as! choosePicViewController
    vc.delegate = self
  }

}

第二个:使用 imagePicker 选择图片 ViewController 选择要在第一个 ViewController 中显示的图像。 2 个按钮:一个用于选择图像,另一个用于使用委托返回第一个视图控制器..

protocol choosePicVCDelegate {
  func goodPic(vc: choosePicViewController)
}

class choosePicViewController: UIViewController {

  var delegate: choosePicVCDelegate?
  let imagePicker = UIImagePickerController()
  var imageData: NSData?

  @IBAction func back(sender: UIButton) {
    delegate?.goodPic(self)
  }

  @IBAction func coverPick(sender: UIButton) {
    if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.PhotoLibrary) {
      imagePicker.sourceType = UIImagePickerControllerSourceType.PhotoLibrary;
      imagePicker.allowsEditing = false
      self.presentViewController(imagePicker, animated: true, completion: nil)
    }
  }

}

extension choosePicViewController: UIImagePickerControllerDelegate {

  func imagePickerController(picker: UIImagePickerController, didFinishPickingImage image: UIImage!, editingInfo: [NSObject : AnyObject]!) {
    self.imageData = UIImageJPEGRepresentation(image, 1.0)
    dismissViewControllerAnimated(true, completion: nil)
  }

  func imagePickerControllerDidCancel(picker: UIImagePickerController) {
    dismissViewControllerAnimated(true, completion: nil)
  }

}

总是从 imageData 得到 nil 属性,不明白为什么。

我认为问题出在您的扩展名上,无论如何我不明白为什么在这种情况下使用扩展名。试试吧。

您需要从 imagePicker.delegate = self 设置委托,因为这样您就可以监听 UIImagePickerController 委托。我相信你会下定决心。

protocol choosePicVCDelegate {
    func goodPic(vc: choosePicViewController)
}

class choosePicViewController: UIViewController, UIImagePickerControllerDelegate {

    var delegate: choosePicVCDelegate?
    let imagePicker = UIImagePickerController()
    var imageData: NSData?

    override func viewWillAppear(animated: Bool) {
        imagePicker.delegate = self;
    }

    override func viewDidDisappear(animated: Bool) {
        imagePicker.delegate = nil;
    }

    @IBAction func back(sender: UIButton) {
        delegate?.goodPic(self)
    }

    @IBAction func coverPick(sender: UIButton) {
        if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.PhotoLibrary) {
            imagePicker.sourceType = UIImagePickerControllerSourceType.PhotoLibrary;
            imagePicker.allowsEditing = false
            self.presentViewController(imagePicker, animated: true, completion: nil)
        }
    }

    //Delegates from UIImagePickerControllerDelegate
    func imagePickerControllerDidCancel(picker: UIImagePickerController) {

    }

    func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [NSObject : AnyObject]) {
        if let img = info[UIImagePickerControllerOriginalImage] as? UIImage{
            self.imageData = UIImageJPEGRepresentation(img, 1.0)
            delegate?.goodPic(self)
            dismissViewControllerAnimated(true, completion: nil)
        }
    }
} 

希望对你有帮助!