Interface Builder の NSTextView で NSLayoutManager を置き換える
Cocoa の NSLayoutManager や NSTypesetter をサブクラス化したい場合、Apple のドキュメント “Assembling the Text System by Hand” にあるように、マニュアルで NSTextView を構築してもいいが面倒だ。それに、このままではスクロールビューでデコレートもされてないのでノーグッド。
どうせなら、Interface Builder で配置した NSTextView の NSLayoutManager を置き換えるのが手っ取り早いだろう。コードは以下のようになる。
- (void) awakeFromNib {
_textStorage = [[NSTextStorage alloc] initWithString:@"Cocoa Programming Topics"];
NSLayoutManager *layoutManager = [[MyLayoutManager alloc] init];
[_textStorage addLayoutManager:layoutManager];
[layoutManager release];
** NSTextContainer *textContainer = [_textView textContainer];
[layoutManager addTextContainer:textContainer];
[textContainer replaceLayoutManager:layoutManager];
**}
肝になるのは NSLayoutManager の addTextContainer: で元々の NSTextContainer を追加したあとに、NSTextContainer の replaceLayoutManager: を呼ぶこと。これで NSLayoutManager を置き換えられる。