簡體   English   中英

類型“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 中可見相同的代碼,顯示沒有觸發錯誤

在此處輸入圖像描述

當我嘗試在我的舊項目中嵌入完全相同的代碼(文件的復制/粘貼)時,問題出現了。

這導致我出現以下錯誤:

類型“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 的屏幕截圖,沒有任何錯誤:

在此處輸入圖像描述

順便說一句,提示應該引導我解決這個問題:

  • 當引用 SwiftUI 庫時,上下文關鍵字為紫色。
  • Context 關鍵字在引用我自己的 Class 時為綠色。

在 iOS 16


typealias UIViewType = UITextView

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM