Kev*_*lia 2 swift swift-extensions swift-protocols
我正在尝试创建一个协议,包含使用UIImagePickerController的过程,使其在我的应用程序中更流线型.我基本上有这样的事情:
public protocol MediaAccessor : UIImagePickerControllerDelegate, UINavigationControllerDelegate {
func mediaCaptured(title: String, fileData: NSData, fileType: String)
}
Run Code Online (Sandbox Code Playgroud)
和一个扩展,它完成了请求权限和处理委托方法的所有繁重工作:
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
}
}
Run Code Online (Sandbox Code Playgroud)
所以一切都编译,但通过扩展实现UIImagePickerControllerDelegate似乎没有注册.当我显示选择器时,它允许我拍照,但是didFinishPickingImage调用永远不会发生.如果我将该调用直接移动到控制器中,一切正常,但这样做的想法是将这些内容从视图控制器中隐藏,以获得非常干净的界面,从而允许控制器从设备访问媒体.通过这样的扩展实现协议方法是不行的?是否有一些我可以改变以允许它工作,而不必直接在我的视图控制器中实现协议?
Cocoa是用Objective-C编写的.Objective-C无法看到Swift协议扩展代码.所以它没有意识到这种实现imagePickerController:didFinishPickingImage:.如果你想让Cocoa调用一个委托方法,你需要把它放在Cocoa可以看到的地方.
| 归档时间: |
|
| 查看次数: |
439 次 |
| 最近记录: |