即使所有方法都已实现,View Controller也不符合协议

时间:2019-04-25 07:30:35

标签: ios swift protocols

我已经使用CocoaPods将库MBDocCapture添加到了我的项目中。现在,正如其自述文件所建议的那样,我使我的视图控制器符合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,清理,构建

这些尝试都没有帮助。
有什么想法吗?

3 个答案:

答案 0 :(得分:1)

您可能在项目中明确定义了一个Error模型(结构或类),这会导致此问题。

要解决此问题,您有两种选择:

  1. 重命名模型,例如MyError
  2. 或将方法的声明更改为didFailWithError error: Swift.Error

当模型范围存在冲突时,始终会出现此错误。当前为extension DocumentUploaderViewController: ImageScannerControllerDelegate编写的委托存根正在考虑在本地范围内定义的项目的Error模型,而委托存根则需要在Swift中定义的Error模型。

答案 1 :(得分:0)

  1. 在整个项目中搜索方法,当函数名称相似或声明两次时,通常会发生这种错误。
  2. 检查是否已将委托设置为适当的视图控制器。像这样:

    let scannerViewController = ImageScannerController()

    scannerViewController.imageScannerDelegate = self

答案 2 :(得分:-1)

不手动添加方法。删除所有方法,并在xcode抱怨时-“类型'DocumentUploaderViewController'不符合协议'ImageScannerControllerDelegate' 您是否要添加协议存根?”

只需单击修复。你完成了。