1

我正在使用以下代码在 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];

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

4

1 回答 1

3

一般说明

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

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

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

NSTextView

问题是关于 anNSTextView及其属性的textStorage。这个属性是类型的NSTextStorage,一个“半具体的子类NSMutableAttributedString”。文档继续,描述了更改存储的字符串NSTextStorage或其属性的首选机制:

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

NSTextView暴露它的属性textStorage,它是NSTextStorage. NSTextStorage是 的子类NSMutableAttributedString。因此,我们可以简单地将我们的属性添加到它:

[self.textView.textStorage addAttribute:NSFontAttributeName
                                  value:[NSFont boldSystemFontOfSize:12.0f]
                                  range:self.textView.selectedRange];
于 2012-10-17T03:59:27.910 回答