NSTextview不会显示韩文文本替换的弹出菜单

时间:2018-05-06 14:04:39

标签: macos cocoa nstextview

(免责声明 - 我不懂韩语,所以我有一些测试例子没有意义,但证明了这个问题。)

我有一个大量定制的NSTextView / NSTextStorage,可以在我的应用中提供语法突出显示和其他行为。韩国用户指出使用macOS文本替换功能存在一些困难。

  1. 接受/拒绝文字替换的弹出式菜单不会显示。

  2. 多字符字符串的文本替换不起作用 - 它似乎只允许最后一个字符触发替换。

  3. 为了测试,我在我的(美国英语)mac上配置了以下文本替换:

    1. (通过键入go创建)已替换为GO(广告素材,我知道......)
    2. to)已替换为TO
    3. ㅂㅈqw)已替换为qw
    4. 햅ㅈgoqw)与go qw
    5. 我启用了2-Set Korean输入源("大写锁定以切换"功能是救生员)(如果重要,我有字体大小18,输入格式Hangul (Hanja) ,并按Gulja删除。
    6. 我在这台机器上运行10.12.6。
    7. 测试环境:

      1. 我下载了Apple的TextEdit源码,编译并使用了它(因此我可以确认TextEdit是使用与我的应用程序相同的SDK编译的)

      2. 我创造了一个玩具"由单个窗口组成的应用程序。在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];
        }
        
      3. 结果:

        1. 使用TextEdit,所有替换都会显示一个弹出菜单,允许我在输入时接受/拒绝替换(韩语以及我自己的英文文本替换)。

        2. 使用玩具应用程序,会自动更改单个字符替换,但不会显示弹出菜单。

        3. 玩具应用程序中未触发两个字符替换。

        4. 在玩具应用程序中快速打字(后面有空格)可以进行所有韩国替换,但仍然没有弹出。

        5. 英文文本替换,包括多字母单词,会显示弹出式菜单(例如mmd - > MultiMarkdown)。

        6. 更改NSTextView的字体不会改变行为(例如TimesAppleMyungjo相同)。

        7. 查看TextEdit代码,我无法找到任何相关内容来表明我做错了什么。弹出窗口出现英文替换但不是韩文替换的事实看起来很奇怪,特别是对于未经修改的NSTextView。使用程序化的NSTextView应该排除我在Xcode界面构建器设置上做错了。 TextEdit使用程序化的NSTextViews,我在他们的设置中看不到任何明显与我有意义的东西,但显然有一些事情在发生。

          任何解决方案?

          谢谢!

0 个答案:

没有答案