didFinishPickingMediaWithInfo Ошибка при использовании Swift 5 - PullRequest
2 голосов
/ 28 марта 2019

Я знаю, что этот вопрос задавался ранее, но ни один из ответов не устранил мою проблему. Я получаю сообщение об ошибке:

Ошибка домена = PlugInKit Code = 13 "запрос отменен" UserInfo = {NSLocalizedDescription = запрос отменен}

У меня есть другой проект, где я использую этот точный метод в другом проекте, который прекрасно работает. Я пытался поместить @objc перед функциями, но получаю эту ошибку:

Метод Objective-C imagePickerController:didFinishPickingMediaWithInfo:, предоставляемый методом imagePickerController(_:didFinishPickingMediaWithInfo:), конфликтует с необязательным методом требования imagePickerController(_:didFinishPickingMediaWithInfo:) в протоколе UIImagePickerControllerDelegate.

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

    guard let uid = Auth.auth().currentUser?.uid else { return }

    if let editedImage = info["UIImagePickerControllerEditedImage"] as? UIImage {

        let editImage = editedImage.withRenderingMode(.alwaysOriginal)

        guard let uploadData = editImage.jpegData(compressionQuality: 0.3) else { return }

        let filename = NSUUID().uuidString

        let stoarageRef = Storage.storage().reference().child("profile_images").child(filename)
        stoarageRef.putData(uploadData, metadata: nil) { (metadata, error) in

            if let error = error {
                print("Failed update profile image:", error)
            }

            stoarageRef.downloadURL(completion: { (downloadUrl, error) in
                guard let profileImageUrl = downloadUrl?.absoluteString else { return }

                print("Successfully updated image in storage:", profileImageUrl)

                let dictionaryValues = ["profileImageUrl": profileImageUrl]

                Database.database().reference().child("users").child(uid).updateChildValues(dictionaryValues, withCompletionBlock: { (error, ref) in

                    if let error = error {
                        print("There was an error:", error)
                        return
                    }

                    print("Successfully saved user info to db")

                })
            })
        }
    } else if let originalImage = info["UIImagePickerControllerOriginalImage"] as? UIImage {

        let origImage = originalImage.withRenderingMode(.alwaysOriginal)

        guard let uploadData = origImage.jpegData(compressionQuality: 0.3) else { return }

        let filename = NSUUID().uuidString

        let stoarageRef = Storage.storage().reference().child("profile_images").child(filename)
        stoarageRef.putData(uploadData, metadata: nil) { (metadata, error) in

            if let error = error {
                print("Failed update profile image:", error)
            }

            stoarageRef.downloadURL(completion: { (downloadUrl, error) in
                guard let profileImageUrl = downloadUrl?.absoluteString else { return }

                print("Successfully updated image in storage:", profileImageUrl)

                let dictionaryValues = ["profileImageUrl": profileImageUrl]

                Database.database().reference().child("users").child(uid).updateChildValues(dictionaryValues, withCompletionBlock: { (error, ref) in

                    if let error = error {
                        print("There was an error:", error)
                        return
                    }

                    print("Successfully saved user info to db")

                })
            })
        }
    }

    dismiss(animated: true, completion: nil)
}

Спасибо за любую помощь в устранении этой проблемы.

Ответы [ 2 ]

1 голос
/ 28 марта 2019

Это не просто проблема Swift 5. Тип параметра info для этого метода делегата давно изменен с [String : Any] на [UIImagePickerController.InfoKey : Any].

Вот почему компилятор жалуется, что ваш, в данном случае ваш собственный , конфликтует с методом, объявленным реализованным протоколом.

Итак, вам нужно реализовать метод делегата с правильным типом параметра

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
    <#code#>
}
0 голосов
/ 28 марта 2019

Имя новой функции - это то, что вызывает ошибку, оно путается с двумя различными функциями, которые делают одно и то же.

Раньше было [String : Any] (это то, что выесть) но теперь они изменили его на [UIImagePickerController.InfoKey : Any].Это изменение означает, что информация будет иметь тип UIImagePickerController.InfoKey.

Попробуйте использовать это как имя своей функции, оно было изменено некоторое время назад (не в Swift 5):

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

Надеюсь, это поможет!

...