目前 SwiftUI 本身不支持多行文本输入(希望很快就会添加此功能!),所以我一直在尝试使用组合框架来实现 UIKit 中的 UITextView,它支持多行输入,但是我得到的结果好坏参半。
这是我创建的用于制作文本视图的代码:
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 视图中实现它,如下所示:
MultilineTextView(text: title ? $currentItem.titleEnglish : $currentItem.pairArray[currentPair].english)//.frame(numLines: 4)
并将其绑定到状态变量:
@State var currentItem:Item
这有点管用。但是,状态 var currentItem:Item 包含一个字符串数组,然后我使用按钮循环遍历该数组,这些按钮根据输入到 MultilineTextView 的内容更新字符串数组。这就是我遇到的问题,其中 MultilineTextView 似乎只绑定到数组中的第一个字符串项,然后它就不会改变。当我使用 swiftUI 的本机 TextField 视图时,此功能工作正常,我可以循环遍历字符串数组并通过在 TextField 中输入文本来更新它。
我认为我必须在 MultilineTextView 结构中缺少某些内容才能允许此功能。任何指点都将不胜感激。
Update:添加了模型结构
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
}
Edit:所以我做了更多的挖掘,发现了我认为的问题所在。当 UITextView 的 textViewDidChange 被触发时,它确实发送我可以在控制台中看到的更新文本。奇怪的是, updateUIView 函数也会被触发,并在通过 textViewDidChange 发送更新之前使用绑定变量中的内容更新 UITextView 的文本。结果是,当您在其中键入内容时,UITextview 拒绝更改。奇怪的是,它适用于数组中的第一个字符串,但是当项目更改时,它就不再起作用了。