Контроллер просмотра, не соответствующий протоколу, хотя реализованы все методы

#ios #swift #protocols

#iOS #swift #протоколы

Вопрос:

Я добавил библиотеку MBDocCapture в свой проект, используя CocoaPods. Теперь, как предполагает его readme, я привел свой контроллер просмотра в соответствие с ImageScannerControllerDelegate и добавил все 4 метода протокола в свой код:

 extension DocumentUploaderViewController: ImageScannerControllerDelegate {
    func imageScannerController(_ scanner: ImageScannerController, didFinishScanningWithResults results: ImageScannerResults) {
        scanner.dismiss(animated: true)
    }

    func imageScannerController(_ scanner: ImageScannerController, didFinishScanningWithPage1Results page1Results: ImageScannerResults, andPage2Results page2Results: ImageScannerResults) {
        scanner.dismiss(animated: true)
    }

    func imageScannerControllerDidCancel(_ scanner: ImageScannerController) {
        scanner.dismiss(animated: true)
    }

    func imageScannerController(_ scanner: ImageScannerController, didFailWithError error: Error) {
        scanner.dismiss(animated: true)
    }
}
  

Теперь Xcode (10.2.1) жалуется, что мне все еще не хватает некоторых заглушек протокола:

Тип ‘DocumentUploaderViewController’ не соответствует протоколу ‘ImageScannerControllerDelegate’
Вы хотите добавить заглушки протокола?

Когда я нажимаю Fix , Xcode добавляет didFailWithError метод:

 func imageScannerController(_ scanner: ImageScannerController, didFailWithError error: Error) {
}
  

… и затем жалуется, что я добавил недопустимое повторное объявление метода (потому что он уже был там!):

Недопустимое повторное объявление ‘imageScannerController(_:didFailWithError:)’

Я уже пробовал:

  • сборка
  • очистка производных данных
  • очистка и сборка
  • завершите Xcode, очистите, создайте
  • перезагрузите мой Mac (10.14.3), откройте Xcode, очистите, соберите

Ни одна из этих попыток не помогла.
Есть идеи?

Комментарии:

1. добавьте некоторый дополнительный код.

2. @Anbu.Karthik какой дополнительный код я должен опубликовать? Другого кода, который я бы счел относящимся к этому вопросу, нет.

3. я думаю, что это вопрос только версии, не могли бы вы, пожалуйста, сказать мне, какую swift-версию MBDocCapture вы используете? и версия swift для вашего проекта?

4. также можете ли вы опубликовать функцию, которая показывает ошибку повторного объявления?

5. @AbuUlHassan в моем проекте используется Swift 4. MBDocCapture 0.1.1 использует Swift 4.2, однако в примере проекта также используется Swift 4. Xcode пытается повторно добавить didFailWithError метод и, следовательно, выдает ошибку повторного объявления для этого метода после добавления.

Ответ №1:

Возможно, в вашем проекте явно определена Error модель (структура или класс), которая вызывает эту проблему.

Чтобы исправить это, у вас есть два варианта:

  1. переименуйте свою модель, например MyError
  2. или измените объявление метода на didFailWithError error: Swift.Error

Эта ошибка всегда появляется, когда возникает конфликт в области видимости модели. Текущие заглушки делегатов, написанные для extension DocumentUploaderViewController: ImageScannerControllerDelegate , учитывают Error модель вашего проекта, определенную в локальной области видимости, в то время как заглушка делегата ожидает Error модель, определенную в Swift.

Комментарии:

1. Потрясающий улов! У меня действительно есть Error модель в моем проекте. Я изменил метод на didFailWithError error: Swift.Error , и теперь он работает. Спасибо!

Ответ №2:

  1. Ищите метод во всем проекте, такого рода ошибки обычно возникают, когда функции имеют похожие имена или объявляются дважды.
  2. Проверьте, установили ли вы делегат для соответствующего контроллера представления. Что-то вроде:

    let scannerViewController = ImageScannerController()

    scannerViewController.imageScannerDelegate = self

Комментарии:

1. Я разрешаю автозаполнению Xcode добавлять методы для меня, поэтому имена определенно идентичны. Я также установил делегат, но он даже не будет компилироваться…

Ответ №3:

Не добавляйте методы вручную. Удалите все методы и когда xcode жалуется — «Тип ‘DocumentUploaderViewController’ не соответствует протоколу ‘ImageScannerControllerDelegate’ Вы хотите добавить заглушки протокола?»

Просто нажмите исправить. И вы закончили.

Комментарии:

1. xcode иногда делает это. И еще одна вещь после добавления методов протокола ctrl B project.

2. Я объяснил в своем сообщении, что я сделал это, и он пожаловался на повторное объявление. Следовательно, все имена методов указаны правильно.

3. Я прочитал ваш пост, и я сталкивался с этой проблемой 100 раз. это всегда исправляет это

4. Я знаю, что обычно это устраняет проблему, но на этот раз этого не происходит, и именно по этой причине я опубликовал этот, казалось бы, глупый вопрос в первую очередь.

5. В этом случае вы можете очистить производные данные и повторить попытку