(Отказ от ответственности - я не понимаю корейский, поэтому у меня есть несколько тестовых примеров, которые не имеют смысла, но демонстрируют проблему.)
У меня есть сильно настроенный NSTextView / NSTextStorage для обеспечения подсветки синтаксисаи другие виды поведения в моем приложении.Пользователь из Кореи указал на некоторые трудности с использованием функции замены текста в macOS.
Всплывающее меню для принятия / отклонения замены текста не отображается.
Текстовые замены многосимвольных строк не работают - кажется, что только последний символ может инициировать замену.
Чтобы проверить, я настроил следующий текстзамены на моем (американском английском) компьютере mac:
해
(создан с помощью набора go
) заменен на GO
(креатив, я знаю ...) 새
(to
) заменяется на TO
ㅂㅈ
(qw
) заменяется на qw
햅ㅈ
(goqw
) на go qw
- Я включил источник входного сигнала
2-Set Korean
(функция «Caps Lock to switch» - это спасение жизни) (Если это имеет значение, у меня есть Размер шрифта 18, Формат ввода Hangul (Hanja)
и Удалить с помощьюGulja
. - Я использую 10.12.6 на этой машине.
Среды тестирования:
Я загрузил исходный код 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
).
ReviИспользуя код TextEdit, я не смог найти ничего подходящего, чтобы указать, что я делаю неправильно.Тот факт, что всплывающие окна появляются с английскими заменами, но не с корейскими, кажется странным, особенно с неизмененным NSTextView.Использование программного NSTextView должно исключить, что я сделал что-то не так с настройкой интерфейса Xcode.TextEdit использует программные NSTextViews, и я не вижу в их настройках ничего очевидного, что бы существенно отличалось от моего, но, очевидно, что-то происходит.
Есть какие-нибудь решения?
Спасибо!