Nano Hash - криптовалюты, майнинг, программирование

Невозможно установить текст в NSTextView из .xib

Ниже приведено упрощенное окно "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

  • Я также должен упомянуть - я создаю с помощью Xcode & Interface Builder 3.2.6 на 10.6.8. 02.05.2013
  • Я бы просто сделал setString для самого NSTextView. 02.05.2013
  • Майк, вы ПРАВИЛЬНО, что setString в самом NSTextView ДЕЙСТВИТЕЛЬНО работает. Тем не менее, мне интересно, почему метод NSTextStorage / NSLayoutManager / NSTextContainer выше не работает. 02.05.2013

Ответы:


1

Я считаю, что вы «редактируете текстовое хранилище за спиной текстового представления». См. Раздел NSTextStorage - edited: range: changeInLength: документация. Документы здесь немного расплывчаты, но я считаю, что -setString: на -mutableString, который вы запрашиваете, не уведомляет само текстовое хранилище об изменении (он только обновляет атрибут, запускается и т.д. при изменении).

Call -edited: range: changeInLength: или используйте метод NSTextView -setString:, как рекомендовал Майк К.

03.05.2013
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..