SwiftUI聊天应用中点击发送按钮如何清除自定义UITextView文本?
解决UITextView绑定文本清空后不同步的问题
我明白你的问题啦——点击发送按钮后,虽然绑定的text变量已经被设为空,但自定义的MessageField里的UITextView文本没跟着清空。这是因为你的updateUIView方法只处理了高度更新,没有根据绑定的text变量来同步UITextView的内容。下面是具体的修复步骤:
1. 修复MessageField的updateUIView方法
在updateUIView中添加逻辑,让UITextView根据绑定的text值更新内容,同时处理占位符的显示:
func updateUIView(_ uiView: UITextView, context: Context) { DispatchQueue.main.async { self.height = uiView.contentSize.height // 根据绑定的text同步UITextView内容 if self.text.isEmpty { // 文本为空时显示占位符 uiView.text = placeholder uiView.textColor = .lightGray } else { // 仅当内容不同时更新,避免循环触发textViewDidChange if uiView.text != self.text { uiView.text = self.text uiView.textColor = .label } } } }
2. 调整协调器的textViewDidChange方法
为了避免外部更新text时触发循环更新,我们需要在协调器的textViewDidChange里做个小判断,只有当当前UITextView的文本不是占位符时,才更新绑定的text变量:
func textViewDidChange(_ textView: UITextView) { DispatchQueue.main.async { self.parent.height = textView.contentSize.height // 只有当文本不是占位符时,才更新绑定的text if textView.text != placeholder && textView.textColor != .lightGray { self.parent.text = textView.text } } }
3. 修复ChatRoom中ChatField的高度绑定
你在ChatRoom里调用ChatField时,高度参数没有用绑定,这会导致高度无法正确更新。把height改成$height:
ChatField(text: $text, height: $height) { print("Sending following text:") print(self.text) }
为什么这样能解决问题?
- 原来的
updateUIView只处理了高度,没有响应text变量的变化,所以当你在发送按钮里把text设为空时,UITextView完全不知道要更新内容。 - 添加的逻辑会在
text变量变化时,主动同步UITextView的内容,同时处理了占位符的显示场景。 - 协调器里的判断避免了外部更新text时,触发
textViewDidChange又把text改回去的循环问题。
现在点击发送按钮后,text变量被清空,updateUIView会触发,把UITextView的内容改成占位符,就实现了你想要的清空效果啦!
内容的提问来源于stack exchange,提问作者NikzJon
相关产品推荐
相关产品推荐

