【问题标题】:Swift 4.2 imagePickerController issueSwift 4.2 imagePickerController 问题
【发布时间】:2019-01-22 14:23:49
【问题描述】:

尝试将聊天客户端从 swift 4 传递到 swift 4.2 并使用选择器我发现了问题。

UIImagePickerControllerEditedImage 不能下标类型的值 '[String : Any]' 带有类型索引 'UIImagePickerController.InfoKey'

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

    if let pickedImage = info[UIImagePickerControllerEditedImage] as? UIImage {
        self.userProfileImage.contentMode = .scaleAspectFit
        self.userProfileImage.image = pickedImage
    }

    picker.dismiss(animated: true, completion: nil)
}

【问题讨论】:

    标签: swift uiimagepickercontroller swift4.2


    【解决方案1】:

    方法签名已更改为

    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any])

    您应该会看到有关函数名称的警告消息

    实例方法 'imagePickerController(:didFinishPickingMediaWithInfo:)' 差不多 符合可选要求 'imagePickerController(:didFinishPickingMediaWithInfo:)' 协议 'UIImagePickerControllerDelegate'

    候选人的类型不匹配 '(UIImagePickerController, [String : 任意]) -> ()'

    将“imagePickerController(_:didFinishPickingMediaWithInfo:)”移动到 另一个使此警告静音的扩展

    将“imagePickerController(_:didFinishPickingMediaWithInfo:)”设为私有 消除此警告

    要求'imagePickerController(_:didFinishPickingMediaWithInfo:)' 在这里声明(UIKit.UIImagePickerControllerDelegate)

    【讨论】:

    • 和 -> 让 image = info[.editedImage] as? UIImage
    【解决方案2】:

    在 Swift 4.2 中,imagePickerController 的委托方法发生了一些变化。请查看以下代码。

    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
    
        var selectedImage: UIImage?
        if let editedImage = info[.editedImage] as? UIImage {
            selectedImage = editedImage
            self.profileImage.image = selectedImage!
            picker.dismiss(animated: true, completion: nil)
        } else if let originalImage = info[.originalImage] as? UIImage {
            selectedImage = originalImage
            self.profileImage.image = selectedImage!
            picker.dismiss(animated: true, completion: nil)
        }
    
    }
    

    这肯定会奏效。

    【讨论】:

    • 我会移动 self.profileImage.image = selectedImage! picker.dismiss(animated: true, completion: nil) 在 'if/else' 语句之外。
    • @Paragon 是的,您可以“picker.dismiss(animated: true, completion: nil)”将其排除在条件之外。谢谢
    【解决方案3】:

    喜欢这个

    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey: Any]) {
        picker.dismiss(animated: true, completion: nil)
        let image = info[UIImagePickerController.InfoKey.originalImage]! as! UIImage
        ...
    }
    

    【讨论】:

      【解决方案4】:

      Swift4.2

       //MARK:- ImagePicker Controller Delegate
       //MARK:-
      
      func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
          dismiss(animated: true, completion: nil)
      }
      
      func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
          if let chosenImage = info[.originalImage] as? UIImage {
              yourimage.contentMode = .scaleAspectFill
              yourimage.image = chosenImage
      
          } else{
              print("Something went wrong")
          }
      }
      

      【讨论】:

        【解决方案5】:
        func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
        
                if let pickedImage = info[UIImagePickerController.InfoKey.editedImage] as? UIImage {
                    yourImage.image = pickedImage
                }else{
                    print("Something went wrong!!")
                }
            }
        

        【讨论】:

          【解决方案6】:
          extension CameraViewController: UIImagePickerControllerDelegate, UINavigationControllerDelegate {
          
              func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
                  if let chosenImage = info[.originalImage] as? UIImage {
                      selectedImage = chosenImage
                      photo.image = chosenImage
                  }
                  dismiss(animated: true, completion: nil)
              }
          }
          

          以上代码解决了警告,图片上传成功

          【讨论】:

          • 请编辑答案以使用纯文本代码块而不是代码图像。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-03-18
          • 1970-01-01
          相关资源
          最近更新 更多