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
相关产品推荐
相关产品推荐

