3

ユーザーが編集するデータを含む がありますが、NSTextViewそれを編集不可能なデータのヘッダーとフッターで囲み、ユーザーにコンテキストのアイデアを提供したいと考えています。

では、編集可能データと編集不可データが混在するという概念を処理できるとは思わないNSTextViewので、いくつかのアイデアを思いつきました。

a) カスタム セルでテキスト添付ファイルを使用して、ヘッダーとフッターを描画します。

b)NSTextView内に 3 つの s がありNSScrollViewます。

c) 属性を使用して編集できないものを決定し、デリゲート メソッドを使用して編集を防止します。これはおそらく最も邪魔にならないため、おそらく私のお気に入りです。

何か不足していますか、より良いアイデアはありますか?

4

1 に答える 1

8

NSTextViewデリゲートメソッド-textView:shouldChangeTextInRange:replacementString:を使用すると、これを実行できます。「NOと言うだけ」で変更できます。;-)

更新/詳細(2015年11月)

この回答のコメントに基づいて詳しく説明するために、テキストビューが編集している属性付き文字列に独自のカスタム属性を使用するというアイデアがあります。標準の属性NSStringに加えて、独自の属性名(任意)とPLIST互換オブジェクトをその名前の値として指定できます。

たとえば、テキストの範囲を「編集不可」として指定する場合は、その範囲の属性に、(たとえば)または:または(ObjC番号ボックスを使用する場合は-same )という名前の属性を追加できます結果:NSNumberインスタンス)。後で、テキストビューがデリゲートに範囲内のテキストを変更する必要があるかどうかを尋ねるときに、属性の存在について範囲を検査できます。@"TextIsEditableAttributeName"NSNumberBOOLYESNO[NSNumber NO]@( NO )@"TextIsEditableAttributeName"

実際には、編集できない範囲に属性を割り当てる必要があるだけなので、値を確認する必要もありません。プレースホルダー用に空のNSDataインスタンスを配置して、属性に値を設定することができます。属性名は、@"EditingLocked"または何かである可能性があります。つまり、提案された範囲内のどこかに属性が存在するかどうかを確認し、テキストビューで要求されたときに戻るだけで済みます。これにより、編集可能な範囲と編集不可能な範囲の重複した選択(編集不可能なテキストをコピーするための選択を許可した場合)がキャッチされます。@"EditingLocked"NO

もちろん、これと同じアプローチは、選択のために範囲値-textView:willChangeSelectionFromCharacterRanges:toCharacterRanges:の「修正された」配列を返すことができる別のデリゲートメソッドでも機能します。編集不可能なテキストの選択を許可したくない場合は、提案された範囲で見つかった属性のインスタンスによって記述された範囲を「切り取る」ことができます。@"EditingLocked"

これがお役に立てば幸いです。

于 2009-11-17T19:32:24.477 に答える