Я пытаюсь создать протокол, который обертывает процесс использования 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 никогда не происходит. Если я переведу этот вызов прямо в контроллер, все будет хорошо, но идея этого заключалась в том, чтобы скрыть этот материал от контроллера вида для очень чистого интерфейса, чтобы позволить контроллеру получать доступ к носителям с устройства. Является ли внедрение методов протокола через расширение, как это, что-то, что не может работать? Есть ли что-то, что я могу изменить, чтобы это работало, без необходимости выполнять протокол непосредственно в моем контроллере?
Ugh, это неудачно, я думаю, что моему VC придется реализовать делегат напрямую и просто направить информацию на расширение. –