如何防止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
相关产品推荐
相关产品推荐

