【问题标题】:View Controller not conforming to protocol, even though all methods are implemented视图控制器不符合协议,即使所有方法都实现了
【发布时间】:2019-04-25 07:30:34
【问题描述】:

我已使用 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,清理,构建

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

【问题讨论】:

  • 添加一些额外的代码。
  • @Anbu.Karthik 我应该发布哪些附加代码?我认为没有其他代码与此问题相关。
  • 我认为它唯一的版本问题你能告诉我你正在使用的 MBDocCapture 的快速版本吗?和您项目的快速版本?
  • 你也可以发布显示重新声明错误的功能吗?
  • @AbuUlHassan 我的项目使用 Swift 4。MBDocCapture 0.1.1 使用 Swift 4.2,但是,示例项目也使用 Swift 4。Xcode 尝试重新添加 didFailWithError 方法,因此,添加后在该方法上抛出重新声明错误。

标签: ios swift protocols


【解决方案1】:

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

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

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

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

【讨论】:

  • 惊人的收获!我的项目中确实有一个Error 模型。我将方法更改为didFailWithError error: Swift.Error,现在它可以工作了。谢谢!
【解决方案2】:
  1. 在整个项目中搜索方法,这种错误通常发生在函数名称相似或被声明两次时。
  2. 检查您是否已将委托设置为适当的视图控制器。比如:

    let scannerViewController = ImageScannerController()

    scannerViewController.imageScannerDelegate = self

【讨论】:

  • 我让 Xcode 自动完成为我添加方法,所以名称肯定是相同的。我也设置了委托,但它甚至不会编译...
【解决方案3】:

不要手动添加方法。删除所有方法和当 xcode 抱怨时 - “类型 'DocumentUploaderViewController' 不符合协议 'ImageScannerControllerDelegate' 要添加协议存根吗?”

只需点击修复。你就完成了。

【讨论】:

  • xcode 有时会这样做。添加协议方法 ctrl+B 项目后还有一件事。
  • 我在帖子中解释说我这样做了,但它抱怨重新声明。因此,方法名称都是正确的。
  • 我读了你的帖子,我已经面对这个问题 100 次了。这总是解决这个问题
  • 我知道这通常可以解决问题,但这次没有,这就是我首先发布这个看似愚蠢的问题的原因。
  • 在这种情况下,您可以清理派生数据并重试
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多