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

如何防止UITextView接收新输入时清空原有内容?

解决UITextView接收MQTT消息时内容被替换的问题

核心问题原因

你当前通过displayNMEA.text = messageDecodedSafe直接赋值的方式会覆盖UITextView的原有内容,导致每次新消息都会替换掉旧内容。要实现保留所有内容并滚动显示的效果,需要改为追加文本而非替换。

修改Swift代码

将MQTT消息接收方法中的文本赋值逻辑改为追加,并添加自动滚动到底部的逻辑,同时确保UI操作在主线程执行(避免后台线程操作UI崩溃):

func mqtt(_ mqtt: CocoaMQTT, didReceiveMessage message: CocoaMQTTMessage, id: UInt16) {
    guard let messageDecodedSafe = String(bytes: message.payload, encoding: .utf8) else {
        fatalError("Couldn't Decode Message")
    }
    
    // 切换到主线程更新UI(MQTT回调可能在后台线程触发)
    DispatchQueue.main.async {
        // 追加新消息到现有文本末尾,保留历史内容
        self.displayNMEA.text = (self.displayNMEA.text ?? "") + messageDecodedSafe
        
        // 自动滚动到最新内容位置,让用户直接看到新消息
        let bottomOffset = CGPoint(x: 0, y: self.displayNMEA.contentSize.height - self.displayNMEA.bounds.size.height)
        self.displayNMEA.setContentOffset(bottomOffset, animated: true)
    }
}

确保UITextView配置正确

检查你的UITextView设置,保证以下属性正确配置(可在Storyboard或代码中设置):

  • isEditable = false:禁止用户编辑文本框,仅用于展示
  • isScrollEnabled = true:开启滚动功能(默认已开启,显式设置更稳妥)
  • 可选:调整textContainerInset属性,设置合适的内边距让内容显示更美观

这样修改后,每次收到新的MQTT消息时,内容会自动追加到文本框末尾,当内容超出可视区域时,文本框会自动滚动到底部显示最新消息,完全符合你期望的效果。

内容的提问来源于stack exchange,提问作者bacata.borisov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 21:12:43