以下は単純化された Obj-C / Cocoa の「hello world」ウィンドウで、Carbon アプリ内から初期化されます。.xib には、NSButton/NSButtonCell および NSScrollView/NSTextView/NSScroller を含む NSView を持つ NSWindow が含まれています。
コードは警告なしでコンパイルおよびリンクされます。ウィンドウは、両方のオブジェクト (ボタンとテキスト フィールド) とともに適切に表示されます。ボタンを押すと、確かに buttonWasPressed に移動し、Xcode のデバッガーの不良セレクターに関するエラーは発生しません。
しかし、NSTextView のテキストは変更されていません。
myTextView に適切なアウトレットが接続されていると思います。おそらく、replaceTextContainer を使用することは、myTextView を textContainer に接続する適切な方法ではありませんか?
悲しいお知らせ: 私の 30 年間の C++ プログラミングは、Obj-C/Cocoa make へのスムーズな移行ではありません...
@implementation DictionaryWindowController
- (id)init {
self = [super init];
// This is actually a separate Cocoa window in a Carbon app -- I load it from the NIB upon command from a Carbon menu event...
NSApplicationLoad();
if (![NSBundle loadNibNamed:@"Cocoa Test Window.nib" owner:self]) {
NSLog(@"failed to load nib");
}
if (self) {
// textStorage is a NSTextStorage* in DictionaryWindowController (NSObject)
textStorage = [[NSTextStorage alloc] initWithString:@""];
NSLayoutManager *layoutManager = [[NSLayoutManager alloc] init];
[givenStorage addLayoutManager:layoutManager];
[layoutManager autorelease];
NSTextContainer *textContainer = [[NSTextContainer alloc] initWithContainerSize:NSMakeSize(kLargeWidthForTextContainer, LargeNumberForText)];
[layoutManager addTextContainer:textContainer];
[textContainer autorelease];
// Is this how to "connect" the myTextView (NSTextView) from the .nib to the textStorage/layoutManager/textContainer?
[myTextView replaceTextContainer:textContainer];
[myTextView setMaxSize:NSMakeSize(LargeNumberForText, LargeNumberForText)];
[myTextView setSelectable:YES];
[myTextView setEditable:YES];
[myTextView setRichText:YES];
[myTextView setImportsGraphics:YES];
[myTextView setUsesFontPanel:YES];
[myTextView setUsesRuler:YES];
[myTextView setAllowsUndo:YES];
// shouldn't I be able to set the string in the NSTextStorage instance and cause the NSTextView to change its text and redraw?
[[textStorage mutableString] setString:@"Default text from initialization..."];
}
return self;
}
- (IBAction)buttonWasPressed:(id)sender {
// Pressing the button DOES get to this point, but the NSTextView didn't change...
[[textStorage mutableString] setString:@"After button press, this text should be the content of the NSTextView."];
}
@end