1

以下は単純化された 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
4

1 に答える 1

2

「テキストビューの背後にあるテキストストレージを編集している」と思います。NSTextStorage の-edited:range:changeInLength:ドキュメントを参照してください。ドキュメントはここでは少しあいまいですが、リクエストしている -setString: on the -mutableString はテキストストレージ自体に変更を通知しないと思います(変更されたときに属性の実行などを更新するだけです)。

-edited:range:changeInLength: を呼び出すか、Mike C. が推奨するように NSTextView の -setString: メソッドを使用します。

于 2013-05-03T20:53:13.813 に答える