##tl;dr
###テキストを追加する
textView.InsertText("foo");
###スクロールする
// 末尾にスクロール
var range = new NSRange(textView.Value.Length, 0);
textView.ScrollRangeToVisible(range);
##NSTextView in Xamarin.Mac
NSTextField
は単一行,NSTextView
はもうちょっと高度な編集UIを提供するという認識で大丈夫かと。
NSTextView
->NSTextContainer
->NSLayoutManager
->NSTextStorage
,従ってテキスト操作はNSTextStorage
をいじっていくことになる。
本稿ではよく使うであろう,文字列の挿入とスクロール状態の変更について記しておきたい。よく忘れるので。
##Insert
テキストを挿入するのは簡単。
textView.InsertText("foo");
現在のカーソル位置に挿入される。ので,末尾に追加したければカーソル位置を末尾に移動すればよい。
var wholeRange = new NSRange(StatusLabel.Value.Length, 0);
textView.SetSelectedRange(wholeRange);
textView.InsertText("bar");
InsertText
は,ユーザーが入力したのと同じ扱いであるため,IsEditable==true
時にしか利用できない。
先述のとおり,本来は下記のようにNSTextStorage
を操作する。これはIsEditable
プロパティに影響されない。
var stor = textView.TextStorage;
stor.BeginEditing();
// 末尾に追加
stor.Append(new NSAttributedString("foo"));
// インデックスを指定して挿入
stor.Insert(new NSAttributedString("bar"), 0);
stor.EndEditing();
内部ではNSAttributedString
をブロックとして持っているので,このブロック毎にインデックスが振られている。
詳細は割愛するが,NSAttributedString
はリッチテキストなので,NSStringAttributes
を指定すれば前景色など装飾要素を設定できる。たとえば背景色を青くするなら,
var s = new NSAttributedString("blue", new NSStringAttributes{BackgroundColor = NSColor.Blue});
##Scroll
ScrollRangeToVisible
を呼ぶだけ。Rangeは表示したい文字列が含まれる範囲。要は指定したカーソル位置がビューの最下行にくるように,うまいことスクロールするというメソッド。
末尾に移動するならこんな感じになる。
textView.ScrollRangeToVisible(new NSRange(textView.Value.Length, 0));
##Conclusion
選択されている矩形を取得したり,テキストの装飾要素をコントロールしやすかったりと高機能なので,慣れてくるとなかなか使いどころの多いニクいやつ。