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