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

TabBar切换控制器时,如何为UITextView指定文本设置固定颜色?

解决方案:给UITextView中的控制器标题设置持久化颜色

要实现给控制器标题(First/Second/Third Controller)设置指定颜色且切换时不丢失样式,核心是用**富文本(NSAttributedString)**替代普通文本,同时修正你代码里的一个小生命周期调用错误,具体步骤如下:

步骤1:改造FromCodeToScreen类,支持富文本样式存储

我们需要把存储消息的数组改成[NSAttributedString],让每条消息都能保留自己的颜色样式,然后在生成消息时单独给标题段设置颜色:

import UIKit

class FromCodeToScreen: NSObject {
    static let shared = FromCodeToScreen()
    // 改为存储带样式的属性字符串,保留颜色信息
    private var arrayForData = [NSAttributedString]()
    private override init() {
        super.init()
    }
    
    func printMessage(textView: UITextView, viewController: UIViewController, function: String = #function) {
        // 自定义标题颜色和默认文本颜色(可按需修改)
        let titleColor = UIColor.systemRed
        let defaultTextColor = textView.textColor ?? UIColor.label
        
        // 构建单条带样式的消息:标题(指定颜色)+ 分隔符 + 方法名(默认颜色)
        let title = viewController.title ?? "Unknown Controller"
        let messageString = NSMutableAttributedString()
        
        // 添加带颜色的控制器标题
        messageString.append(NSAttributedString(
            string: title,
            attributes: [.foregroundColor: titleColor]
        ))
        // 添加分隔符和生命周期方法名(默认颜色)
        messageString.append(NSAttributedString(
            string: " - \(function)\n",
            attributes: [.foregroundColor: defaultTextColor]
        ))
        
        // 将新消息存入数组
        arrayForData.append(messageString)
        
        // 拼接所有消息成完整的富文本内容
        let fullContent = NSMutableAttributedString()
        arrayForData.forEach { fullContent.append($0) }
        
        // 设置给textView并滚动到底部
        textView.attributedText = fullContent
        textViewScrollToBottom(textView)
    }
    
    // 实现滚动到底部的辅助方法
    private func textViewScrollToBottom(_ textView: UITextView) {
        let bottomOffset = CGPoint(x: 0, y: textView.contentSize.height - textView.bounds.size.height + textView.contentInset.bottom)
        if bottomOffset.y > 0 {
            textView.setContentOffset(bottomOffset, animated: true)
        }
    }
}

步骤2:修正ViewController中的生命周期调用错误

注意你代码里viewDidAppear方法调用了错误的super方法,这会导致生命周期流程异常,需要修正:

import UIKit

class FirstViewController: UIViewController {
    @IBOutlet var firstTextView: UITextView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        FromCodeToScreen.shared.printMessage(textView: firstTextView, viewController: self)
    }
    
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        FromCodeToScreen.shared.printMessage(textView: firstTextView, viewController: self)
    }
    
    override func viewDidAppear(_ animated: Bool) {
        // 修正:这里应该调用super.viewDidAppear而非viewWillAppear
        super.viewDidAppear(animated)
        FromCodeToScreen.shared.printMessage(textView: firstTextView, viewController: self)
    }
    
    // 其他生命周期方法(如viewWillDisappear等)同理修正super调用
}

步骤3:确保切换控制器时颜色持久化

因为我们用attributedText替代了普通的text属性,所有样式都会被保存在NSAttributedString中,加上arrayForData全局存储了所有带样式的消息,切换控制器时调用printMessage生成的内容会自动保留之前的颜色设置,不会丢失。

额外提示

  • 你可以随意修改titleColor的值,比如换成UIColor.systemBlue、UIColor.green等自定义颜色;
  • 如果需要清空历史消息,可以给FromCodeToScreen添加一个clearMessages方法,重置arrayForData并清空textView内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 06:37:58