我正在使用以下代码在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];
由于这两种方法都有效,我想知道哪种方法更好。
答案 0 :(得分:3)
获取类所暴露的接口。假设返回类型是声明的返回类型的特定子类,这不是最佳实践。
这在类集群的上下文中尤为重要:公共接口的不同实现对于同一方法可能具有不同的不同返回类型,尽管这些返回类型保证与标头中声明的类型兼容。
假设您可以保证类集群中的所有未记录的子类目前都返回标题中声明的类型的相同特定子类,则无法保证在将来的Apple框架修订版中仍然如此。
问题是关于NSTextView
及其属性textStorage
。此属性的类型为NSTextStorage
,是“NSMutableAttributedString
的半独立子类”。 documentation继续,描述了更改NSTextStorage
或其属性存储的字符串的首选机制:
使用NSMutableAttributedString,NSAttributedString,NSMutableString和NSString定义的文本访问方法来执行字符级操作。
NSTextView
公开其属性textStorage
,该属性是NSTextStorage
的实例。 NSTextStorage
是NSMutableAttributedString
的子类。因此,我们可以简单地添加我们的属性:
[self.textView.textStorage addAttribute:NSFontAttributeName
value:[NSFont boldSystemFontOfSize:12.0f]
range:self.textView.selectedRange];