2016-12-17 5 views
0

これは私のオブジェクトクラスの関数ですが、 'didFinishPickingMediaWithInfo'関数は画像を撮影した後に呼び出されません。また、imagepickerを提示しているのViewControllerは異なるスウィフトのファイルであるUIImagePickerControllerが自分のObjectクラスに委譲しないのはなぜですか?

+0

あなたはシミュレータや電話でこれを試していますか?シミュレータにはカメラがないので、シミュレータでは動作しません –

+0

私はこれを電話で試しています – Dee

+0

@Dee info.plistに 'NSPhotoLibraryUsageDescription'を追加しましたか? ? –

答えて

-1

この:

self.viewController.present(imagePicker, animated: true, completion: nil) 

次のようになります。

self.present(imagePicker, animated: true, completion: nil) 
+0

クラスにはviewcontrollerがありません。すべてのUIImagePicker関数を処理するクラスを作成したので、imagePickerをどのように表示するかをクラスを使用するviewcontrollerに弱い参照を作成しました。 – Dee

+0

実際のビューコントローラの参照を 'weak var viewController: MyProfileVC! '? –

+0

ご迷惑をおかけして申し訳ありません。 CameraPickerのイニシャライザメソッドで、送信者が弱い変数 – Dee

0

私は同じ問題を抱えていたし、私は解決策を見つけました、私はバージョンを投稿しています(私は写真ライブラリから写真を撮っていますが、それは同じです:))。

私はメモリ管理の問題がありました。 カメラのハンドラクラス(デリゲートを内部に...)をインスタンス化したIBAction関数を作成しました。関数の終わりに、変数は範囲外になり、割り当てが解除されます。この問題を解決するために、インスタンス変数として作成しました。

私UiButtonとVCのための私のコードです:

class STECreateUserVC: UIViewController { 

    @IBOutlet weak var imgAvatar: UIImageView! 
    let cameraHandler = STECameraHandler() 

    @IBAction func buttonPressed(_ sender: UIButton) { 
     cameraHandler.importPictureIn(self) { [weak self] (image) in 
      self?.imgAvatar.image = image 
     } 
    } 
} 

...そしてそれは私のハンドラです:

class STECameraHandler: NSObject { 

    let imagePickerController = UIImagePickerController() 
    var completitionClosure: ((UIImage) -> Void)? 

    func importPictureIn(_ viewController: UIViewController, completitionHandler:((UIImage) -> Void)?) { 
     completitionClosure = completitionHandler 
     imagePickerController.delegate = self 
     imagePickerController.allowsEditing = true 
     imagePickerController.sourceType = .photoLibrary 
     imagePickerController.mediaTypes = UIImagePickerController.availableMediaTypes(for: .photoLibrary)! 
     viewController.present(imagePickerController, animated: true, completion: nil) 
    } 
} 

extension STECameraHandler: UIImagePickerControllerDelegate, UINavigationControllerDelegate { 
    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { 
     if let completitionClosure = completitionClosure, let image = info[UIImagePickerControllerEditedImage] as? UIImage { 
      completitionClosure(image) 
     } 
     imagePickerController.dismiss(animated: true) 
    } 
} 

私はクリーンなコードを持っているために、クロージャを使用しました。

関連する問題