imagePickerController:didFinishPickingMediaWithInfo 与协议中的可选要求方法冲突 'UIImagePickerControllerDelegate'
imagePickerController:didFinishPickingMediaWithInfo conflicts with optional requirement method in protocol 'UIImagePickerControllerDelegate'
这是完整的错误:
Objective-C method 'imagePickerController:didFinishPickingMediaWithInfo:' provided by method
'imagePickerController(_ :didFinishPickingMediaWithInfo:)'
conflicts with optional requirement method 'imagePickerController(_:didFinishPickingMediaWithInfo:)'
in protocol 'UIImagePickerControllerDelegate'
它出现在我的 ViewController.swift 文件中此函数的第一个:
func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [NSObject : AnyObject]){
if let pickedImage = info[UIImagePickerControllerOriginalImage] as? UIImage {
ImageView.contentMode = .ScaleAspectFit
ImageView.image = pickedImage
}
dismissViewControllerAnimated(true, completion: nil)
}
我正在尝试学习本教程:http://www.codingexplorer.com/choosing-images-with-uiimagepickercontroller-in-swift/
从错误方法中,我收集到有一个方法 didFinishPickingMediaWithInfo 是从 imagePickerController 基础 class 获取的,它不喜欢我试图覆盖它。但这就是我所知道的。我在网上找到的所有 imagePickerController 函数都是这样的。我做错了什么?
我正在使用 Xcode 7,如果有区别的话。 ]
正确的函数头是:
func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {
<#code#>
}
注意信息字典声明中的 String
而不是 NSObject
。
我不确定为什么文档说你必须写 NSObject
,但 String
是正确的。
如果您实施任何协议方法,我建议您使用 Xcode 的自动完成功能来确保您不会 运行 遇到这样的问题。
我不确定 Xcode 从哪里获得自动完成,但它似乎总是与实际的编译器同步,这最终是你必须担心的一件事,而不是一些在线苹果文档!尤其是在框架不断变化甚至语言本身也在发展的时代。
如果您使用的是 Xcode 7,您可能会以 iOS 9 为目标,那么,其中的方法签名略有变化:
func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [NSObject : AnyObject]) {
至:
func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {
NSObject
已更改为 String
。
在Swift3中改为
func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any])
以下是 UIImagePickerController 的 didFinishPickingMediaWithInfo 委托的格式:
public func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject])
在您的情况下,在函数参数中使用 String 而不是 NSObject。
我在 XCode 8
中编写 UIImagePickerControllerDelegate 的扩展时遇到了这个问题
XCode 8 自动完成为第一个参数生成一个带有下划线的方法签名。这会在 Swift 编译器中造成分段错误。删除下划线可以解决问题。
// CRASH SegFault 11
@objc protocol MyDelegate: UIImagePickerControllerDelegate {
}
extension MyDelegate {
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
// code
}
}
// DOESN'T CRASH
@objc protocol MyDelegate: UIImagePickerControllerDelegate {
}
extension MyDelegate {
func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
// code
}
}
这是完整的错误:
Objective-C method 'imagePickerController:didFinishPickingMediaWithInfo:' provided by method 'imagePickerController(_ :didFinishPickingMediaWithInfo:)' conflicts with optional requirement method 'imagePickerController(_:didFinishPickingMediaWithInfo:)' in protocol 'UIImagePickerControllerDelegate'
它出现在我的 ViewController.swift 文件中此函数的第一个:
func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [NSObject : AnyObject]){
if let pickedImage = info[UIImagePickerControllerOriginalImage] as? UIImage {
ImageView.contentMode = .ScaleAspectFit
ImageView.image = pickedImage
}
dismissViewControllerAnimated(true, completion: nil)
}
我正在尝试学习本教程:http://www.codingexplorer.com/choosing-images-with-uiimagepickercontroller-in-swift/
从错误方法中,我收集到有一个方法 didFinishPickingMediaWithInfo 是从 imagePickerController 基础 class 获取的,它不喜欢我试图覆盖它。但这就是我所知道的。我在网上找到的所有 imagePickerController 函数都是这样的。我做错了什么?
我正在使用 Xcode 7,如果有区别的话。 ]
正确的函数头是:
func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {
<#code#>
}
注意信息字典声明中的 String
而不是 NSObject
。
我不确定为什么文档说你必须写 NSObject
,但 String
是正确的。
如果您实施任何协议方法,我建议您使用 Xcode 的自动完成功能来确保您不会 运行 遇到这样的问题。
我不确定 Xcode 从哪里获得自动完成,但它似乎总是与实际的编译器同步,这最终是你必须担心的一件事,而不是一些在线苹果文档!尤其是在框架不断变化甚至语言本身也在发展的时代。
如果您使用的是 Xcode 7,您可能会以 iOS 9 为目标,那么,其中的方法签名略有变化:
func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [NSObject : AnyObject]) {
至:
func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {
NSObject
已更改为 String
。
在Swift3中改为
func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any])
以下是 UIImagePickerController 的 didFinishPickingMediaWithInfo 委托的格式:
public func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject])
在您的情况下,在函数参数中使用 String 而不是 NSObject。
我在 XCode 8
中编写 UIImagePickerControllerDelegate 的扩展时遇到了这个问题XCode 8 自动完成为第一个参数生成一个带有下划线的方法签名。这会在 Swift 编译器中造成分段错误。删除下划线可以解决问题。
// CRASH SegFault 11
@objc protocol MyDelegate: UIImagePickerControllerDelegate {
}
extension MyDelegate {
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
// code
}
}
// DOESN'T CRASH
@objc protocol MyDelegate: UIImagePickerControllerDelegate {
}
extension MyDelegate {
func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
// code
}
}