在SwiftUI中使用UIView包

问题描述 投票:0回答:1

RichTextView 是一个UIView包。它不能像下面这样使用。

import SwiftUI
import RichTextView

struct ContentView1: View {

    var body: some View {
        VStack {
            RichTextView(              // <-- Wrong!
                input: "Test",
                latexParser: LatexParser(),
                font: UIFont.systemFont(ofSize: UIFont.systemFontSize),
                textColor: UIColor.black,
                isSelectable: true,
                isEditable: false,
                latexTextBaselineOffset: 0,
                interactiveTextColor: UIColor.blue,
                textViewDelegate: nil,
                frame: CGRect.zero,
                completion: nil
            )
        }
    }
}

我还发现了一个引用 如何为SwiftUI包装一个自定义的UIView? 作为以下。

struct TextView: UIViewRepresentable {
    @Binding var text: String

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

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

struct ContentView : View {
    @State var text = ""

    var body: some View {
        TextView(text: $text)
            .frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: .infinity)
    }
}

但我尝试了很多方法来使用 RichTextViewUIViewRepresentable. 还是不行。如下所示。

struct RichTextView: UIViewRepresentable {
    @Binding var text: String

    let richTextView = RichTextView(
        input: text, <-- Cannot use instance member 'text' within property initializer; property initializers run before 'self' is available
        latexParser: LatexParser(),
        font: UIFont.systemFont(ofSize: UIFont.systemFontSize),
        textColor: UIColor.black,
        isSelectable: true,
        isEditable: false,
        latexTextBaselineOffset: 0,
        interactiveTextColor: UIColor.blue,
        textViewDelegate: nil,
        frame: CGRect.zero,
        completion: nil
    )

    func makeUIView(context: Context) -> UITextView {

        return UITextView()
    }

    func updateUIView(_ uiView: UITextView, context: Context) {
        uiView.text = richTextView  <--- changed
    }
}

已更新。下面还是不行

struct RichTextView: UIViewRepresentable {             <-- Error:Type 'RichTextView' does not conform to protocol 'UIViewRepresentable'

  @Binding var text: String

  func makeUIView(context: Context) -> RichTextView {
    return RichTextView(                               <-- Error:Extra arguments at positions #1, #2, #3, #4, #5, #6, #7, #8, #9, #10, #11 in call
      input: text,                                     <-- Error:Missing argument for parameter 'text' in call
      latexParser: LatexParser(),
      font: UIFont.systemFont(ofSize: UIFont.systemFontSize),
      textColor: UIColor.black,
      isSelectable: true,
      isEditable: false,
      latexTextBaselineOffset: 0,
      interactiveTextColor: UIColor.blue,
      textViewDelegate: nil,
      frame: CGRect.zero,
      completion: nil
    )
  }

  func updateUIView(_ richTextView: RichTextView, context: Context) {
    richTextView.text = text
  }
}

如何使之?谢谢大家的帮助。

ios uiview uikit swiftui
1个回答
1
投票

我想你要找的是更多的类似这样的东西。

struct RichTextView: UIViewRepresentable {

  @Binding var text: String

  func makeUIView(context: Context) -> RichTextView {
    return RichTextView(
      input: text,
      latexParser: LatexParser(),
      font: UIFont.systemFont(ofSize: UIFont.systemFontSize),
      textColor: UIColor.black,
      isSelectable: true,
      isEditable: false,
      latexTextBaselineOffset: 0,
      interactiveTextColor: UIColor.blue,
      textViewDelegate: nil,
      frame: CGRect.zero,
      completion: nil
    )
  }

  func updateUIView(_ richTextView: RichTextView, context: Context) {
    richTextView.text = text
  }
}

UIViewRepresentable 使用swift属名意味着你可以指定相关的视图类型,在这种情况下,你只需返回 RichTextView.

我还没有测试过这个,所以可能需要一些调整,但希望它能给你指出正确的方向。

© www.soinside.com 2019 - 2024. All rights reserved.