You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:06:27