Geometry 関数
NSBundle
NSDictionary
NSFileManager
NSMutableAttributedString
NSNumber
NSScanner
NSString
NSTimer
Graphic 関数
NSApplication
NSBezierPath
NSCell
NSColor
NSCursor
NSCustomImageRep
NSDocument
NSDocumentController
NSDragging
NSEvent
NSFontManager
NSGraphicsContext
NSImage
NSMenu
NSOutlineView
NSPanel
NSPopUpButton
NSResponder
NSScrollView
NSString 追加
NSTableColumn
NSTableView
NSTextStorage
NSTextView
-テキストを取り扱うための構造
-NSTextView にテキストを追加する
NSToolbar
NSView
NSWindow
NSWorkspace
その他
.nib ウィンドウ
Views パレット
クラス
インスタンス変数
メソッド
CFXML
Carbon Event
Carbon Graphics
Cocoa で日本語
メソッド
その他

- Application Kit-
NSTextView

Application Kit - NSTextView
テキストを取り扱うための構造
Keywords: NSTextView

テキストを表示、編集するためのユーザインタフェースってのは、PC のもっとも基本的な機能の 1 つだけど、もっともめんどくさいものでもあるんだ。だって、ざっと考えただけでも、インプットメソッドから入力を受けて、コピー、ペーストをして、いろんなフォントを設定して、改行とかページ分割も考えて、横書きもあれば縦書きもあるし、左から書く文字もあれば右から書く文字もあるし、あぁもう大変!

そんなめんどくさいものだけど、いろんなフレームワークが、いろんな手法を提供している。ここでは、もちろん Cocoa のやり方を見てみるよ。

Appliaction Kit では、テキストを取り扱うために 4 つの主要なクラスを提供している。NSTextStorage、NSLayoutManager、NSTextContainer、NSTextView だ。4 つのクラスの関係は、下の図の通り。

textStructure

NSTextStorage がテキストを保持して、NSTextView がユーザからの操作(キーボードからの入力とか、マウス操作とか)を受け付けるんだ。各クラスの仕事は以下の通りだ。

NSTextStorage
こいつは、テキストそのものを保持しているんだ(つまりテキストのバイトデータ)。実際のところ、NSMutableAttributedString から継承されているクラスだからな。あと、NSLayoutManager への参照を持っていて、テキストが変更されたら通知するんだ。

NSLayoutManager
こいつが実際にテキストを画面に書くんだ。NSTextStorage から文字を取り出して、そいつのグリフを作る。そのグリフを、NSTextContainer の形に従って、NSTextView に書くんだ。

NSTextContainer
これは、テキストが書かれる領域を管理するクラスなんだ。文がどこで改行されるか?とかいうことを取り扱う。あと、サブクラスを作れば、円形にテキストを書いたり、好きな形にテキストを配置することができたりするらしい。

NSTextView
これが、テキストのフロントエンドだ。テキストをユーザに表示して、キーボードやマウスからのイベントを受けるのだ。


Application Kit - NSTextView
NSTextView にテキストを追加する
Keywords: append text

NSTextView ってのは、テキストを表示したり、ユーザからの入力を受け付けるためのインタフェース。だから、テキストを追加したりするには、本来なら NSTextStorage を使わないといけない。だけど、めんどくさいといえば、めんどくさいんだよねー。というわけで、NSTextView からテキストを追加するための方法だ。NSTextView の一番最後に文字列を追加する方法を調べよう。

NSTextView は insertText: っていうメソッドを持っている。これは、キーボードから文字を入力した時に使われるメソッドだ。

Application Kit/NSTextView.h
- (void)insertText:(id)insertString;

このメソッドが呼ばれると、今のカーソルの位置に文字列が挿入されるんだ。ということは、カーソルを一番後ろに持っていってから、このメソッドを呼べば、文字列が追加されることになるんだ。

そういう戦略で、コードを。

NSTextViewEx.m (sample)
- (void)appendText:(NSString*)text
{
    NSRange	wholeRange;
    NSRange	endRange;
    
	[self selectAll:nil];
    wholeRange = [self selectedRange];
    endRange = NSMakeRange(wholeRange.length, 0);
    [self setSelectedRange:endRange];
    [self insertText:text];
}

これは NSTextView にメソッドを追加したものね。まず、selectAll:selectedRange と呼んでやって文字列全体の長さを得る。そして、長さ 0 で、文字列の一番最後の位置の NSRange を作ってやって、そこを選択する。つまり、カーソルを最後尾に持っていく。で、insertText: を呼んでやればオッケーだ。



[Home] [Download] [Archives] [BBS] [Cocoa Programming Tips 1001] [Core Foundation の秘密] [Safari Developer Center] [はじめてのブラウザのつくり方] [Sketch BP] [スクリーンセイバーを作ろう] [Objective-C 最適化] [Authorization API 完全理解] [Mac OS X Programming Books Review] [オブジェクト指向の言語比較論] [panther-dev]

mailto: mkino@xd5.so-net.ne.jp