通过扩展实现协议
Implement protocol through extension
我正在尝试创建一个协议来包装使用 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 调用从未发生。如果我将该调用直接移动到控制器中,一切正常,但这样做的想法是将这些东西从视图控制器中隐藏起来,以获得一个非常干净的界面,从而允许控制器从设备访问媒体。通过这样的扩展来实现协议方法是行不通的吗?有什么我可以更改以允许它工作,而不必直接在我的视图控制器中实现协议吗?
Cocoa写成Objective-C。 Objective-C 看不到 Swift 协议扩展代码。所以它不知道 imagePickerController:didFinishPickingImage:
的实现。如果你想让一个委托方法被Cocoa调用,你需要把它放在Cocoa可以看到的地方。
我正在尝试创建一个协议来包装使用 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 调用从未发生。如果我将该调用直接移动到控制器中,一切正常,但这样做的想法是将这些东西从视图控制器中隐藏起来,以获得一个非常干净的界面,从而允许控制器从设备访问媒体。通过这样的扩展来实现协议方法是行不通的吗?有什么我可以更改以允许它工作,而不必直接在我的视图控制器中实现协议吗?
Cocoa写成Objective-C。 Objective-C 看不到 Swift 协议扩展代码。所以它不知道 imagePickerController:didFinishPickingImage:
的实现。如果你想让一个委托方法被Cocoa调用,你需要把它放在Cocoa可以看到的地方。