在 SwiftUI 中更改在 TextEditor 上键入的字符
Change characters typed on TextEditor in SwiftUI
我正在尝试捕获在 TextEditor 中键入的文本,将其存储在变量中并更新 TextEditor 本身上显示的内容。我正在使用 .onChange()
触发和捕获正在键入的内容,将其存储在变量中,并更改当前显示的文本。但问题是,.onChange()
被调用了两次:首先,当我在 TextEditor 中键入文本时;其次,当我尝试为视图本身设置不同的字符时。
struct ChatView: View {
@State var chatTextInput: String = ""
@State var oldChatValue: String = ""
@State var newChatValue: String = ""
var body: some View {
VStack {
TextEditor(text: $chatTextInput)
.onChange(of: chatTextInput) { newValue in
oldChatValue += "a"
newChatValue += newValue.last.map{String([=10=])}!
chatTextInput = oldChatValue
}
}
}
}
例如,如果我键入 qwerty,newChatValue
将打印为 Qawaearataya 并且 chatTextInput
接收 aaaaaaaaaaaa
当我为 TextEditor 文本设置新字符时,关于如何防止第二次触发 .onChange 的任何线索?
非常感谢!
您的问题只是 .onChange(of:)
不是 TextEditor
的响应者,它是变量的响应者,在本例中为 chatTextInput
。由于 chatTextInput
绑定到 TextEditor
,当您键入一个字母时,chatTextInput
会更新,并且 .onChange(of:)
会运行。但是,作为 .onChange(of:)
运行 的一部分,您更改 chatTextInput
调用 .onChange(of:) again. You would have an infinite loop, except that
.onChange(of:)` 在这一点结束。如果有人能解释一下,我很想听听。
然而,解决方法是简单地在 .onChange(of:)
中放置一个标志,以便仅每隔一次设置变量,如下所示:
struct ChatView: View {
@State var chatTextInput: String = ""
@State var oldChatValue: String = ""
@State var newChatValue: String = ""
@State var textEntryFlag = true
var body: some View {
VStack {
TextEditor(text: $chatTextInput)
.onChange(of: chatTextInput) { newValue in
if textEntryFlag {
oldChatValue += "a"
newChatValue += newValue.last.map{String([=10=])}!
chatTextInput = oldChatValue
}
textEntryFlag.toggle()
}
}
}
}
我正在尝试捕获在 TextEditor 中键入的文本,将其存储在变量中并更新 TextEditor 本身上显示的内容。我正在使用 .onChange()
触发和捕获正在键入的内容,将其存储在变量中,并更改当前显示的文本。但问题是,.onChange()
被调用了两次:首先,当我在 TextEditor 中键入文本时;其次,当我尝试为视图本身设置不同的字符时。
struct ChatView: View {
@State var chatTextInput: String = ""
@State var oldChatValue: String = ""
@State var newChatValue: String = ""
var body: some View {
VStack {
TextEditor(text: $chatTextInput)
.onChange(of: chatTextInput) { newValue in
oldChatValue += "a"
newChatValue += newValue.last.map{String([=10=])}!
chatTextInput = oldChatValue
}
}
}
}
例如,如果我键入 qwerty,newChatValue
将打印为 Qawaearataya 并且 chatTextInput
接收 aaaaaaaaaaaa
当我为 TextEditor 文本设置新字符时,关于如何防止第二次触发 .onChange 的任何线索?
非常感谢!
您的问题只是 .onChange(of:)
不是 TextEditor
的响应者,它是变量的响应者,在本例中为 chatTextInput
。由于 chatTextInput
绑定到 TextEditor
,当您键入一个字母时,chatTextInput
会更新,并且 .onChange(of:)
会运行。但是,作为 .onChange(of:)
运行 的一部分,您更改 chatTextInput
调用 .onChange(of:) again. You would have an infinite loop, except that
.onChange(of:)` 在这一点结束。如果有人能解释一下,我很想听听。
然而,解决方法是简单地在 .onChange(of:)
中放置一个标志,以便仅每隔一次设置变量,如下所示:
struct ChatView: View {
@State var chatTextInput: String = ""
@State var oldChatValue: String = ""
@State var newChatValue: String = ""
@State var textEntryFlag = true
var body: some View {
VStack {
TextEditor(text: $chatTextInput)
.onChange(of: chatTextInput) { newValue in
if textEntryFlag {
oldChatValue += "a"
newChatValue += newValue.last.map{String([=10=])}!
chatTextInput = oldChatValue
}
textEntryFlag.toggle()
}
}
}
}