2014-02-20 1 views
2

Когда представление содержит NSTextField с включенной подсказкой расширения и текст не подходит, тогда пользователь наводит курсор на поле, OS X показывает всплывающую подсказку расширения. Если вы затем вызываете setStringValue: для изменения текстового содержимого NSTextField, размер всплывающей подсказки расширения не обновляется. Например, если исходный текст имеет длину 100 символов, но новый текст имеет длину всего 50 символов, над новым текстом отображается всплывающая подсказка расширения, достаточно большая для 100 символов, содержащих новый текст. Это верно, даже если новая строка полностью помещается в NSTextField, что обычно препятствует появлению всплывающей подсказки расширения.Как обновить размер всплывающей подсказки расширения после вызова NSTextField setStringValue :?

Противоположность также возникает: если исходная строка соответствует NSTextField, всплывающая подсказка расширения не появляется. Если новая строка не помещается в пределах NSTextField, всплывающая подсказка не появляется, хотя она должна.

Внутренний номер NSTextFieldNSTextFieldCell реализует метод expansionFrameWithFrame:inView:. Что-то (я не уверен, что) называет это один раз и, похоже, кэширует результат. Установка новой строки с использованием setStringValue: не вызывает эту функцию для вызова снова.

Вызов setNeedsDisplay на NSTextField после звонка setStringValue: не исправляет это.

Как я могу получить AppKit для изменения размера всплывающей подсказки расширения?

+0

Я ответил на свой вопрос, но на этот раз я не буду принимать свой ответ, если кто-то придумает менее храбрый способ решить эту проблему. –

+0

Я нахожу это печально забавным, что большинство вопросов какао в хакерском ответе автор вопроса ... – tofutim

+0

Я только что понял, что оставил комментарий выше 3 лет назад. Еще раз спасибо за публикацию этого. – tofutim

ответ

2

После большого количества экспериментов я нашел два способа исправить это.

Очень сложный способ - удалить и воссоздать весь NSTextField каждый раз, когда текст изменяется. Это трудоемко, потому что NSTextField не соответствует протоколу NSCopying, поэтому вам необходимо использовать NSArchiver и NSUnarchiver для дублирования оригинала NSTextField, и даже тогда некоторые атрибуты не копируются, например, ограничения.

Простым способом является скрыть и спрятать NSTextField.

NSTextField *textField; 
{...} 
[textField setStringValue:newText]; 
[textField setHidden:YES]; 
[textField setHidden:NO]; 

Это делает AppKit вызов expansionFrameWithFrame:inView: на NSTextField «s NSTextFieldCell, которые должным образом обновляет наличие и размер расширительного всплывающей подсказке в.

+0

Боб, это работает как волшебство. – tofutim