Macos 调用NSTextField setStringValue:后如何更新扩展工具提示大小?
当视图包含启用了扩展工具提示的Macos 调用NSTextField setStringValue:后如何更新扩展工具提示大小?,macos,tooltip,nstextfield,appkit,Macos,Tooltip,Nstextfield,Appkit,当视图包含启用了扩展工具提示的NSTextField且文本不适合时,用户将光标悬停在该字段上,OS X将显示扩展工具提示。如果随后调用setStringValue:更改NSTextField的文本内容,则扩展工具提示的大小不会更新。例如,如果原始文本的长度为100个字符,而新文本的长度仅为50个字符,则将鼠标悬停在新文本上,将显示一个扩展工具提示,该提示的大小足以容纳包含新文本的100个字符。即使新字符串完全适合NSTextField,这也是正确的,这通常会阻止出现扩展工具提示 相反的情况也会发
NSTextField
且文本不适合时,用户将光标悬停在该字段上,OS X将显示扩展工具提示。如果随后调用setStringValue:
更改NSTextField
的文本内容,则扩展工具提示的大小不会更新。例如,如果原始文本的长度为100个字符,而新文本的长度仅为50个字符,则将鼠标悬停在新文本上,将显示一个扩展工具提示,该提示的大小足以容纳包含新文本的100个字符。即使新字符串完全适合NSTextField
,这也是正确的,这通常会阻止出现扩展工具提示
相反的情况也会发生:如果原始字符串位于NSTextField
中,则不会显示展开工具提示。如果新字符串不适合NSTextField
,则不会显示展开工具提示,即使它应该显示
在内部,NSTextField
的NSTextFieldCell
实现了NSCell
方法expansionFrameWithFrame:inView:
。某个东西(我不确定是什么)调用了这个函数一次,并且似乎缓存了结果。使用setStringValue:
设置新字符串不会导致再次调用此函数
调用setStringValue:
后,在NSTextField上调用setNeedsDisplay
,无法解决此问题
那么如何让AppKit调整扩展工具提示的大小呢?经过大量实验,我找到了两种方法来解决这个问题 非常困难的方法是每次文本更改时删除并重新创建整个
NSTextField
。这很费劲,因为NSTextField
不符合NSCopying
协议,因此您必须使用NSArchiver
和nsunachiver
复制原始NSTextField
,甚至某些属性也不会被复制,例如约束
最简单的方法是隐藏和取消隐藏NSTextField
NSTextField *textField;
{...}
[textField setStringValue:newText];
[textField setHidden:YES];
[textField setHidden:NO];
这使得AppKit在
NSTextField
的NSTextFieldCell
上调用expansionFrameWithFrame:inView:
,从而正确更新扩展工具提示的存在和大小。[textField resetCursorRects]
似乎也会导致在NSTextFieldCell
上调用expansionFrameWithFrame:inView:
。仅在macOS 10.14中测试。我已经回答了我自己的问题,但我现在不会接受我的答案,以防有人想出一种不太老套的方法来解决这个问题。我发现,令人悲哀的是,大多数可可问题都是由问题的作者以老套的方式回答的……我刚刚意识到我在3年前就留下了上面的评论。再次感谢您发布此邮件。