【问题标题】:Type 'TextView' does not conform to protocol 'UIViewRepresentable'类型“TextView”不符合协议“UIViewRepresentable”
【发布时间】:2021-03-22 18:51:06
【问题描述】:

我开始在一个新的干净项目中试验 SwiftUI 的东西。

在这个新项目中,创建了一个符合 UIViewRepresentable 的结构。 这个想法是在 SwiftUI 视图中嵌入一个 UIKit 视图。一切正常。

import SwiftUI

struct ExempleFromSwitfUIBasedProject: View {
    
    @State var text = "Hello World"
    
    var body: some View {
        VStack {
            TextView(text: $text)
                .frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: 44.0)
        }
    }
}

struct TextView: UIViewRepresentable {
    @Binding var text: String

    func makeUIView(context: Context) -> UITextView {
        return UITextView()
    }

    func updateUIView(_ uiView: UITextView, context: Context) {
        uiView.text = text
        uiView.backgroundColor = UIColor.red
    }
}

struct ExempleFromSwitfUIBasedProject_Previews: PreviewProvider {
    static var previews: some View {
        ExempleFromSwitfUIBasedProject()
    }
}

在我的 IDE 中可见的相同代码显示没有触发错误

当我尝试在我的旧项目中嵌入完全相同的代码(文件的复制/粘贴)时出现问题。

这导致我出现以下错误:

类型“TextView”不符合协议“UIViewRepresentable”

import SwiftUI

struct ExempleFromLegacyBasedProject: View {
    
    @State var text = "Hello World"
    
    var body: some View {
        VStack {
            TextView(text: $text)
                .frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: 44.0)
        }
    }
}

struct TextView: UIViewRepresentable {
    @Binding var text: String

    func makeUIView(context: Context) -> UITextView {
        return UITextView()
    }

    func updateUIView(_ uiView: UITextView, context: Context) {
        uiView.text = text
        uiView.backgroundColor = UIColor.red
    }
}

struct ExempleFromSwitfUIBasedProject_Previews: PreviewProvider {
    static var previews: some View {
        ExempleFromLegacyBasedProject()
    }
}

在我的 IDE 中可以看到相同的代码来显示触发的错误

总结一下: 在一个干净的项目中,我使用“UIViewRepresentable”协议没有任何问题。 在几年前创建的遗留项目中,我只是复制了同一个文件,这引发了编译错误。

两个项目都有一个最小部署目标 >= iOS 13。

感谢您的帮助

【问题讨论】:

  • 您需要edit 将您的问题包含为文本,使用正确的代码格式(而不是屏幕截图),以minimal reproducible example 的形式提出问题主题。

标签: ios swift swiftui uiviewrepresentable


【解决方案1】:

经过几个小时的挣扎,我发现出了什么问题。

我的遗留项目使用了一个第三方库,它也引用了一个名为“Context”的类。

在我的情况下,而不是引用应该来自 SwiftUI 框架的正确 Context

typealias Context = UIViewRepresentableContext

Xcode 指的是与第三方类而不是 SwiftUI 相关的 Context 对象。

解决这个问题的一种方法是用

替换“上下文”关键字
UIViewRepresentableContext<TextView>

您可以在下面找到更新的完整代码:

import SwiftUI

struct ExempleFromLegacyBasedProject: View {
    
    @State var text = "Hello World"
    
    var body: some View {
        VStack {
            TextView(text: $text)
                .frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: 44.0)
        }
    }
}

struct TextView: UIViewRepresentable {
    @Binding var text: String

    func makeUIView(context: UIViewRepresentableContext<TextView>) -> UITextView {
        return UITextView()
    }

    func updateUIView(_ uiView: UITextView, context: UIViewRepresentableContext<TextView>) {
        uiView.text = text
        uiView.backgroundColor = UIColor.red
    }
}

struct ExempleFromSwitfUIBasedProject_Previews: PreviewProvider {
    static var previews: some View {
        ExempleFromLegacyBasedProject()
    }
}

在下面,您可以看到 IDE 的屏幕截图,没有任何错误:

顺便说一句,提示应该引导我解决问题:

  • Context 关键字在引用 SwiftUI 库时为紫色。
  • Context 关键字在引用我自己的类时是绿色的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-23
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多