1

次のコードを使用して、NSTextViewで選択したテキストを太字にします

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

ここで、self.textViewはNSTextViewへのアウトレットです。Xcodeは、プロパティがNSAttributedString型であり、NSMutableAttributedStringではないため、addAttributeが機能しない可能性があることを警告します。コードは機能しますが、この方法で行うのは間違っていますか?もしそうなら、適切な方法は何ですか?

更新:
私はこれを行う別の方法を見つけました:

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

問題は、NSTextView'sとそのプロパティについてtextStorageです。このプロパティはNSTextStorage、「の半コンクリートサブクラス」タイプNSMutableAttributedStringです。またはその属性によって格納された文字列を変更するための推奨メカニズムについて説明しているドキュメントが続きます。NSTextStorage

NSMutableAttributedString、NSAttributedString、NSMutableString、およびNSStringで定義されたテキストアクセスメソッドを使用して、文字レベルの操作を実行します。

NSTextViewtextStorageのインスタンスであるプロパティを公開しますNSTextStorageNSTextStorageのサブクラスですNSMutableAttributedString。したがって、属性を追加するだけで済みます。

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