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

iOS代码编辑器开发:如何检测UITextView内容变更?

检测UITextView内容变更的几种实用方法

嘿,针对你做代码编辑器的需求,我整理了几个在iOS上检测UITextView内容变化的常用方案,每个都有具体代码示例,你可以根据自己的项目情况选择:

方法一:利用UITextViewDelegate代理方法

这是最经典也是最常用的方式,适合大多数场景:

  1. 首先确保你的ViewController遵守UITextViewDelegate协议
  2. 在viewDidLoad里给textView设置代理
  3. 实现textViewDidChange方法,内容变化时会自动触发
import UIKit

class CodeEditorViewController: UIViewController, UITextViewDelegate {
    @IBOutlet weak var textView: UITextView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        textView.delegate = self
        // 可以在这里初始化你的代码高亮逻辑
    }
    
    // 内容变化时触发的方法
    func textViewDidChange(_ textView: UITextView) {
        // 这里调用你的代码高亮处理函数
        applySyntaxHighlighting(to: textView)
    }
    
    // 示例:代码高亮方法(你可以根据自己的需求实现)
    private func applySyntaxHighlighting(to textView: UITextView) {
        // 这里写你的语法检测和颜色设置逻辑,比如识别注释并设为灰色
        // ...
    }
}

方法二:监听UITextViewTextDidChangeNotification通知

如果不想用代理(比如多个地方需要监听同一个textView),可以用通知中心:

import UIKit

class CodeEditorViewController: UIViewController {
    @IBOutlet weak var textView: UITextView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // 添加通知观察者
        NotificationCenter.default.addObserver(
            self,
            selector: #selector(handleTextChange(_:)),
            name: UITextView.textDidChangeNotification,
            object: textView
        )
    }
    
    @objc private func handleTextChange(_ notification: Notification) {
        guard let textView = notification.object as? UITextView else { return }
        // 处理内容变化,调用高亮逻辑
        applySyntaxHighlighting(to: textView)
    }
    
    // 记得在页面销毁时移除观察者,避免内存泄漏
    deinit {
        NotificationCenter.default.removeObserver(self)
    }
    
    private func applySyntaxHighlighting(to textView: UITextView) {
        // 你的高亮实现
        // ...
    }
}

方法三:Combine框架(iOS 13及以上)

如果你的项目已经采用Combine响应式编程,这种方式更简洁,无需手动管理代理或通知:

import UIKit
import Combine

class CodeEditorViewController: UIViewController {
    @IBOutlet weak var textView: UITextView!
    // 用于保存订阅,避免被提前释放
    private var textChangeCancellable: AnyCancellable?
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // 订阅textView的text属性变化
        textChangeCancellable = textView.publisher(for: \.text)
            .sink(receiveValue: { [weak self] newText in
                guard let self = self, let textView = self.textView else { return }
                // 处理内容变化
                self.applySyntaxHighlighting(to: textView)
            })
    }
    
    private func applySyntaxHighlighting(to textView: UITextView) {
        // 你的高亮实现
        // ...
    }
}

小提示

不管用哪种方法,在处理代码高亮时,建议尽量优化性能——比如不要每次字符变化都全量重新渲染,可以只更新变化的部分,避免UITextView卡顿,尤其是代码内容比较多的时候。

内容的提问来源于stack exchange,提问作者user9620161

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:30:41