2016-05-02 18 views
1

UIImagePickerControllerを使用するプロセスをラップするプロトコルを作成して、アプリケーションでストリームリーンにすることを試みています。拡張を介してプロトコルを実装する

public protocol MediaAccessor : UIImagePickerControllerDelegate, UINavigationControllerDelegate { 
    func mediaCaptured(title: String, fileData: NSData, fileType: String) 
} 

と許可を要求し、デリゲートメソッドを処理するすべての重労働を行い拡張子:

public extension MediaAccessor where Self : UIViewController { 
    public func captureMedia() { 
     //All sorts of checks for picker authorization 
     let picker = UIImagePickerController() 
     picker.delegate = self 
     self.presentViewController(picker, animated: true, completion: nil) 
    } 

    func imagePickerController(picker: UIImagePickerController, didFinishPickingImage image: UIImage!, editingInfo: [NSObject : AnyObject]!) { 
     //implementation of the delegate in extension 
     //even though everything compiles, this method is not called on picker completion 
    } 
} 

だから、すべてがコンパイルされますが、経由UIImagePickerControllerDelegateを実装し、私は基本的にこのようなものを持っています拡張機能は登録されていないようです。ピッカーを表示すると、写真を撮ることができますが、didFinishPickingImageコールは決して起こりません。そのコールをコントローラに直接移動すると、すべて正常に動作しますが、コントローラからメディアにアクセスできるようにするために、非常にきれいなインターフェイスのために、このことをビューコントローラから隠すことでした。このような拡張機能を介してプロトコルメソッドを実装していて、うまくいかないものはありますか?私のビューコントローラで直接プロトコルを実装する必要なく、これを動作させるために何か変更できますか?

答えて

3

ココアはObjective-Cで書かれています。 Objective-CはSwiftプロトコル拡張コードを見ることができません。だから、imagePickerController:didFinishPickingImage:の実装には気づいていません。 Cocoaによってデリゲートメソッドをとしたい場合は、Cocoaが表示できる場所にデリゲートメソッドを配置する必要があります。

+0

ああ、残念ですが、私のVCはデリゲートを直接実装して、その情報をエクステンションにプッシュする必要があります。 –

関連する問題