类型 'TextView' 不符合协议 'UIViewRepresentable'
Type 'TextView' does not conform to protocol 'UIViewRepresentable'
我开始在一个干净的新项目中试验 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 中可以看到相同的代码,表明没有触发错误
当我尝试在我的旧项目中嵌入完全相同的代码(文件的 copy/paste)时出现问题。
这导致我出现以下错误:
Type 'TextView' does not conform to protocol '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.
感谢您的帮助
经过几个小时的努力,我发现了问题所在。
我的遗留项目使用了第三方库,该库也引用了一个名为“Context”的 Class。
在我的例子中,而不是引用应该来自 SwiftUI 框架的正确 Context。
typealias Context = UIViewRepresentableContext
Xcode 指的是与第三方 class 而不是 SwiftUI 相关的上下文对象。
解决这个问题的方法是用
替换“上下文”关键字
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的截图没有任何错误:
顺便说一句,提示应该会引导我解决问题:
- 当引用 SwiftUI 库时,Context 关键字为紫色。
- 上下文关键字在引用我自己的关键字时是绿色的Class。
我开始在一个干净的新项目中试验 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 中可以看到相同的代码,表明没有触发错误
当我尝试在我的旧项目中嵌入完全相同的代码(文件的 copy/paste)时出现问题。
这导致我出现以下错误:
Type 'TextView' does not conform to protocol '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.
感谢您的帮助
经过几个小时的努力,我发现了问题所在。
我的遗留项目使用了第三方库,该库也引用了一个名为“Context”的 Class。
在我的例子中,而不是引用应该来自 SwiftUI 框架的正确 Context。
typealias Context = UIViewRepresentableContext
Xcode 指的是与第三方 class 而不是 SwiftUI 相关的上下文对象。
解决这个问题的方法是用
替换“上下文”关键字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的截图没有任何错误:
顺便说一句,提示应该会引导我解决问题:
- 当引用 SwiftUI 库时,Context 关键字为紫色。
- 上下文关键字在引用我自己的关键字时是绿色的Class。