ImagePickerController: didFinishPickingMediaWithInfo конфликтует с необязательным методом требований в протоколе 'UIImagePickerControllerDelegate'

Вот полная ошибка:

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, если это имеет значение. ]

Снимок экрана 1

Ответ 1

Правильная голова функции:

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

Обратите внимание на String вместо NSObject в объявлении словаря информации.

Я не уверен, почему документы говорят, что вам нужно написать NSObject, но String является правильным.

Если вы применяете любые методы протокола, я бы рекомендовал использовать автоматическое завершение Xcode, чтобы убедиться, что вы не сталкиваетесь с такими проблемами.

enter image description here

Я не знаю, где Xcode получает это автозаполнение, но похоже, что он всегда синхронизируется с фактическим компилятором, который, в конце концов, является тем, о чем вам нужно беспокоиться, а не некоторым онлайн-документам Apple! Особенно в те времена, когда рамки постоянно меняются, и даже сам язык находится в стадии разработки.

Ответ 2

Если вы используете 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])

Ответ 3

Ниже представлен формат делегата didFinishPickingMediaWithInfo из UIImagePickerController:

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

В вашем случае используйте Строка вместо NSObject в функциональном параметре.

Снимок экрана 1

Ответ 4

У меня возникла проблема с написанием расширения для UIImagePickerControllerDelegate в XCode 8

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
    }
}