(免责声明 - 我不懂韩语,所以我有一些测试例子没有意义,但证明了这个问题。)
我有一个大量定制的NSTextView / NSTextStorage,可以在我的应用中提供语法突出显示和其他行为。韩国用户指出使用macOS文本替换功能存在一些困难。
接受/拒绝文字替换的弹出式菜单不会显示。
多字符字符串的文本替换不起作用 - 它似乎只允许最后一个字符触发替换。
为了测试,我在我的(美国英语)mac上配置了以下文本替换:
해
(通过键入go
创建)已替换为GO
(广告素材,我知道......)새
(to
)已替换为TO
ㅂㅈ
(qw
)已替换为qw
햅ㅈ
(goqw
)与go qw
2-Set Korean
输入源("大写锁定以切换"功能是救生员)(如果重要,我有字体大小18,输入格式Hangul (Hanja)
,并按Gulja
删除。测试环境:
我下载了Apple的TextEdit源码,编译并使用了它(因此我可以确认TextEdit是使用与我的应用程序相同的SDK编译的)
我创造了一个玩具"由单个窗口组成的应用程序。在ViewController的viewDidLoad
中,我使用它来用基本的NSTextView替换内容(没有任何自定义):
- (void)viewDidLoad {
[super viewDidLoad];
NSView * contentView = [self view];
NSRect cFrame = [contentView bounds];
NSView * oldView = [[self.view subviews] firstObject];
[oldView removeFromSuperview];
// Create basic NSTextView with mostly default settings
NSTextView * newView = [[NSTextView alloc] initWithFrame:cFrame];
[newView setTranslatesAutoresizingMaskIntoConstraints:NO];
[self.view setAutoresizingMask:NSViewHeightSizable | NSViewWidthSizable];
[newView setVerticallyResizable:YES];
[newView setHorizontallyResizable:NO];
// Scrollview for convenience
NSScrollView * scroller = [[NSScrollView alloc] initWithFrame:cFrame];
[scroller setAutoresizingMask:NSViewWidthSizable | NSViewWidthSizable];
[scroller setHasVerticalRuler:YES];
[scroller setUsesPredominantAxisScrolling:YES];
[scroller setHorizontalScrollElasticity:NSScrollElasticityNone];
[scroller setDocumentView:newView];
[self.view addSubview:scroller];
// Do any additional setup after loading the view.
textView = newView;
[textView setRulerVisible:YES];
}
结果:
使用TextEdit,所有替换都会显示一个弹出菜单,允许我在输入时接受/拒绝替换(韩语以及我自己的英文文本替换)。
使用玩具应用程序,会自动更改单个字符替换,但不会显示弹出菜单。
玩具应用程序中未触发两个字符替换。
在玩具应用程序中快速打字(后面有空格)可以进行所有韩国替换,但仍然没有弹出。
英文文本替换,包括多字母单词,会显示弹出式菜单(例如mmd
- > MultiMarkdown
)。
更改NSTextView的字体不会改变行为(例如Times
与AppleMyungjo
相同)。
查看TextEdit代码,我无法找到任何相关内容来表明我做错了什么。弹出窗口出现英文替换但不是韩文替换的事实看起来很奇怪,特别是对于未经修改的NSTextView。使用程序化的NSTextView应该排除我在Xcode界面构建器设置上做错了。 TextEdit使用程序化的NSTextViews,我在他们的设置中看不到任何明显与我有意义的东西,但显然有一些事情在发生。
任何解决方案?
谢谢!