2012-02-29 4 views
1

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

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

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

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

ответ

1

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

- (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, чтобы быть королевской болью в шее, но настойчиво, поскольку мне очень нравится его презентационная сторона.

EDIT: Мое поле токена привязано к методу tagsAsArray представляемого объекта контроллера вида. Поэтому в основном я использовал привязки Cocoa для решения проблемы.

+0

Спасибо, я передам ваши предложения выстрел позже сегодня. Полностью согласен с вашим Королевским PITA;) –

+0

Просто проверил ваше решение и выяснилось, что [tokenField setRepresentedObject: nil]; имеет тот же побочный эффект, что и отключение и повторение ответа, а именно выбор всего поля токена. –

+1

Обнаружено обходное решение на основе вашего решения: [tokenField setObjectValue: [NSArray arrayWithArray: [tokenField objectValue]]]; Кажется, что установка одних и тех же значений, но внутри нового массива вызывает перерисовку токена без побочного эффекта выбора. Это немного грязный хак, который Apple должен предоставить более чистое решение, но в любом случае я приму свой ответ, поскольку это приведет меня к приемлемому решению. –

-1

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

text_view = token_field.cell().fieldEditorForView_(token_field) 
text_view.setNeedsDisplay_(YES) 
Смежные вопросы