Обновление NSTokenField после программного изменения контента - PullRequest
1 голос
/ 01 марта 2012

Я реализовал NSTokenField, который использует некоторые пользовательские объекты данных для отображения динамических данных.Делегат настроен нормально и отображает правильные значения токена.

Я также реализовал меню токенов, которое позволяет выбрать формат, используемый для отображения каждого токена.Моя проблема, однако, в том, что я не могу заставить NSTokenField немедленно реагировать на эти изменения и перерисовывать токен с новым выбранным форматом.

Если я щелкаю за пределами NSTokenField, чтобы он отказывался, первый респондент немедленно перерисовывает.Я также могу сделать это программным путем, явно указав в качестве первого респондента ноль.Единственная проблема с этим состоит в том, что NSTokenField теряет фокус - и переназначает его, поскольку первый респондент выбирает все в поле, чтобы пользователь мог случайно перезаписать весь контент.

Так что мой вопрос заключается в том, есть ли какой-либо способ простозапуск NSTokenField для перерисовки его содержимого без изменения фокуса и выделения?

Ответы [ 2 ]

1 голос
/ 01 марта 2012

У меня была та же проблема, и я обнаружил, что единственное работоспособное решение состояло в том, чтобы «сбрасывать» поле токена при каждом изменении его содержимого. В основном это сводилось к запуску следующего метода контроллера представления, который обрабатывал представление с полем токена:

- (void) resetTokenField {

    // Force the token field to redraw itself by resetting the represented object.

    id anObject = [self representedObject];
    [self setRepresentedObject: nil];
    [self setRepresentedObject: anObject];
    [[self tokenField] setNeedsDisplay: YES];

}

Представляемый объект - это объект, который содержит все отображаемые токены. В моем случае это был фрагмент текста Richt, где токены - это, в основном, теги.

Я обнаружил, что NSTokenField - королевская боль в шее, но она продолжалась, поскольку мне очень нравилась ее презентационная сторона.

РЕДАКТИРОВАТЬ: мое поле токена было привязано к методу tagsAsArray представленного объекта контроллера представления. Так что в основном я использовал привязки Какао для решения этой проблемы.

0 голосов
/ 04 апреля 2016

Оказывается, вы должны вызывать setNeedsDisplay для объекта NSTextView, используемого NSTokenField, вместо вызова setNeedsDisplay для самого NSTokenField. Таким образом, работает следующий код: (Написано в PyObjC)

text_view = token_field.cell().fieldEditorForView_(token_field)
text_view.setNeedsDisplay_(YES)
...