Ниже приведено упрощенное окно "hello world" Obj-C / Cocoa, которое инициализируется из приложения Carbon. .Xib содержит NSWindow, в котором есть NSView, содержащий NSButton / NSButtonCell и NSScrollView / NSTextView / NSScroller (ы).
Код компилируется и связывается без предупреждений. Окно отображается правильно, с обоими объектами (кнопкой и текстовым полем). Нажатие кнопки действительно переходит к 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