![](/img/trans.png)
[英]SwiftUI: GMSMapView does not conform to protocol 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 中可見相同的代碼,顯示沒有觸發錯誤
當我嘗試在我的舊項目中嵌入完全相同的代碼(文件的復制/粘貼)時,問題出現了。
這導致我出現以下錯誤:
類型“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。
謝謝你的幫助
掙扎了幾個小時后,我發現出了什么問題。
我的遺留項目使用了一個第三方庫,它也引用了一個名為“Context”的 Class。
在我的情況下,而不是引用應該來自 SwiftUI 框架的正確上下文。
typealias Context = UIViewRepresentableContext
Xcode 指的是與第三方 class 而不是 SwiftUI 相關的上下文 object。
擺脫這個對我來說是個問題的方法是將“上下文”關鍵字替換為
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 的屏幕截圖,沒有任何錯誤:
順便說一句,提示應該引導我解決這個問題:
在 iOS 16
typealias UIViewType = UITextView
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.