gpt4 book ai didi

SwiftUI UIViewRepresentable UITextView 绑定(bind)

转载 作者:行者123 更新时间:2023-12-04 11:36:28 28 4
gpt4 key购买 nike

多行文本输入目前在 SwiftUI 中不受 native 支持(希望很快添加此功能!)所以我一直在尝试使用组合框架从 UIKit 实现支持多行输入的 UITextView,但是我的结果喜忧参半.

这是我创建的用于制作 TextView 的代码:

struct MultilineTextView: UIViewRepresentable {

@Binding var text: String


func makeUIView(context: Context) -> UITextView {
let view = UITextView()
view.isScrollEnabled = true
view.isEditable = true
view.isUserInteractionEnabled = true
view.backgroundColor = UIColor.white
view.textColor = UIColor.black
view.font = UIFont.systemFont(ofSize: 17)
view.delegate = context.coordinator
return view
}

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

func frame(numLines: CGFloat) -> some View {
let height = UIFont.systemFont(ofSize: 17).lineHeight * numLines
return self.frame(height: height)
}

func makeCoordinator() -> MultilineTextView.Coordinator {
Coordinator(self)
}

class Coordinator: NSObject, UITextViewDelegate {
var parent: MultilineTextView

init(_ parent: MultilineTextView) {
self.parent = parent
}

func textViewDidChange(_ textView: UITextView) {
parent.text = textView.text
}
}
}

然后我在 swiftUI View 中实现了它,例如:
MultilineTextView(text: title ? $currentItem.titleEnglish : $currentItem.pairArray[currentPair].english)//.frame(numLines: 4)

并将其绑定(bind)到状态变量:
@State var currentItem:Item

它有点工作。但是,状态 var currentItem:Item 包含一个字符串数组,然后我将使用按钮循环遍历这些字符串,这些按钮根据输入到 MultilineTextView 中的内容更新字符串数组。这是我遇到的问题,其中 MultilineTextView 似乎只绑定(bind)到数组中的第一个字符串项,然后它不会改变。当我使用 swiftUI 的原生 TextField View 时,此功能工作正常,我可以循环遍历字符串数组并通过将文本输入到 TextField 来更新它。

我想我一定在 MultilineTextView 结构中遗漏了一些东西来允许这个功能。任何指点都非常感谢。

更新:添加模型结构
struct Item: Identifiable, Codable {
let id = UUID()
var completed = false
var pairArray:[TextPair]
}

struct TextPair: Identifiable, Codable {
let id = UUID()
var textOne:String
var textTwo:String
}

编辑:
所以我做了更多的挖掘,我发现了我认为的问题。当 UITextView 的 textViewDidChange 被触发时,它会发送我可以在控制台中看到的更新文本。奇怪的是,随后 updateUIView 函数也被触发,并在通过 textViewDidChange 发送更新之前使用绑定(bind) var 中的内容更新 UITextView 的文本。结果是 UITextview 在您输入时拒绝更改。奇怪的是,它适用于数组中的第一个 String,但是当该项目被更改时,它将不再起作用。

最佳答案

SwiftUI 似乎创建了 UIViewRepresentable 的两个变体。 , 对于每个绑定(bind),但在 state 时不切换它们,即 title已切换......可能是由于缺陷,值得提交给Apple。

我找到了可行的解决方法(使用 Xcode 11.2/iOS 13.2 测试),而是使用如下明确不同的 View

if title {
MultilineTextView(text: $currentItem.titleEnglish)
} else {
MultilineTextView(text: $currentItem.pairArray[currentPair].textOne)
}

关于SwiftUI UIViewRepresentable UITextView 绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59840437/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com