【问题标题】:imagePickerController:didFinishPickingMediaWithInfo conflicts with optional requirement method in protocol 'UIImagePickerControllerDelegate'imagePickerController:didFinishPickingMediaWithInfo 与协议“UIImagePickerControllerDelegate”中的可选要求方法冲突
【发布时间】:2015-10-08 19:46:29
【问题描述】:

这是完整的错误:

Objective-C 方法 'imagePickerController:didFinishPickingMediaWithInfo:' 方法提供 'imagePickerController(_ :didFinishPickingMediaWithInfo:)' 与可选要求方法 'imagePickerController(_:didFinishPickingMediaWithInfo:)' 冲突 在协议'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 基类获取的,它不喜欢我试图覆盖它。但这就是我所知道的。我在网上找到的所有 imagePickerController 函数都是这样的。我做错了什么?

我正在使用 Xcode 7,如果这有什么不同的话。 ]

【问题讨论】:

    标签: ios swift ios8 uiimagepickercontroller xcode7


    【解决方案1】:

    如果您使用的是 Xcode 7,那么您的目标可能是 iOS 9,其中方法签名略有不同:

    func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [NSObject : AnyObject]) {
    

    到:

    func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {
    

    NSObject 已更改为 String

    Swift 3 中改为

    func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any])
    

    【讨论】:

      【解决方案2】:

      我在 XCode 8 中为 UIImagePickerControllerDelegate 编写扩展时遇到了这个问题

      XCode 8 Autocomplete 为第一个参数生成带有下划线的方法签名。这会在 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
          }
      }
      

      【讨论】:

        【解决方案3】:

        以下是 UIImagePickerController 的 didFinishPickingMediaWithInfo 委托的格式:

         public func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject])
        

        在您的情况下,在函数参数中使用 String 而不是 NSObject

        【讨论】:

          【解决方案4】:

          正确的函数头是:

          func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {
              <#code#>
          }
          

          注意 info 字典声明中的 String 而不是 NSObject

          我不确定为什么文档说你必须写 NSObject,但 String 是正确的。

          如果您实现任何协议方法,我建议您使用 Xcode 的自动完成功能,以确保您不会遇到此类问题。

          我不确定 Xcode 从哪里获得自动完成功能,但它似乎总是与实际的编译器同步,这最终是您需要担心的一件事,而不是一些在线苹果文档!尤其是在框架不断变化,甚至语言本身也在开发中的时候。

          【讨论】:

          • 您的回答解决了我的问题,虽然 XCode 8 自动完成导致它,所以自动完成也可能是错误的。请参阅下面的答案
          • Swift 3: 'func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {'
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-01-22
          • 2015-06-05
          • 1970-01-01
          • 2019-07-09
          相关资源
          最近更新 更多