Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 调用NSTextField setStringValue:后如何更新扩展工具提示大小?_Macos_Tooltip_Nstextfield_Appkit - Fatal编程技术网

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年前就留下了上面的评论。再次感谢您发布此邮件。