【问题标题】:Making selected text bold in an NSTextView在 NSTextView 中使选定的文本变为粗体
【发布时间】:2013-11-04 03:42:15
【问题描述】:

我正在使用以下代码在 NSTextView 中使选定的文本变为粗体

  [self.textView.attributedString addAttribute:NSFontAttributeName value:[NSFont boldSystemFontOfSize:12] range:self.textView.selectedRange];

self.textView 是 NSTextView 的出口。 Xcode 发出警告,addAttribute 可能无法正常工作,因为该属性的类型为 NSAttributedString 而不是 NSMutableAttributedString。代码可以工作,但这样做是错误的吗?如果是这样,正确的方法是什么?

更新:
我找到了另一种方法:

NSMutableAttributedString *textFieldText = [self.textView.attributedString mutableCopy];
[textFieldText addAttribute:NSFontAttributeName value:[NSFont boldSystemFontOfSize:12] range:self.textView.selectedRange];
[self.textView.textStorage setAttributedString:textFieldText];

由于这两种方法都有效,我想知道哪种方法更好。

【问题讨论】:

  • 我认为您的更新是可行的方法。
  • 我认为您的解决方案是唯一正确的方法。不要忘记释放/自动释放复制的对象,复制增加保留计数器。(如果你不使用 ARC)
  • 没有人知道我在哪里可以找到这些的权威答案。我试着在 developer.apple.com 上四处寻找...

标签: cocoa nstextview foundation


【解决方案1】:

一般说明

以类公开的接口为例。假定返回类型是声明的返回类型的特定子类不是最佳实践。

这在类集群的上下文中尤其重要:公共接口的不同实现可能对同一方法有不同的不同返回类型,尽管这些返回类型保证与标头中声明的类型兼容。

假设您可以保证类集群中所有未记录的子类当前返回标题中声明的类型的相同特定子类,您不能保证在 Apple 框架的未来修订版中仍然如此。

NSTextView

问题是关于NSTextView 及其属性textStorage。该属性属于NSTextStorage 类型,是“NSMutableAttributedString 的半混凝土子类”。 documentation 继续,描述了更改 NSTextStorage 或其属性存储的字符串的首选机制:

使用 NSMutableAttributedString、NSAttributedString、NSMutableString 和 NSString 定义的文本访问方法来执行字符级操作。

NSTextView 公开其属性textStorage,它是NSTextStorage 的一个实例。 NSTextStorageNSMutableAttributedString 的子类。因此,我们可以简单地将我们的属性添加到它:

[self.textView.textStorage addAttribute:NSFontAttributeName
                                  value:[NSFont boldSystemFontOfSize:12.0f]
                                  range:self.textView.selectedRange];

【讨论】:

  • 如果您能提供“正确”的代码,我会接受您的回答。
  • 我想我不够勤奋,无法深入研究文档……但它是一片丛林。
  • 确实如此。不过,这种方法是文档推荐的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-02
  • 1970-01-01
相关资源
最近更新 更多