2016-05-02 4 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

Ugh, это неудачно, я думаю, что моему VC придется реализовать делегат напрямую и просто направить информацию на расширение. –