UILexicon в Objective-C

Как вы используете UILexicon в Objective-C? Я считаю, что документация, которую предоставляет Apple, крайне бесполезна.

Что оно делает? Возвращает ли он словарь или правильное написание слов? Или я предоставляю слово типа «привет», и оно сопоставляет его с правильным написанием «Привет» и возвращает его в виде строки?

Любая помощь будет оценена по достоинству.

requestSupplementaryLexiconWithCompletion:


Вот мой отчет об ошибках, но, очевидно, у меня будут ошибки, потому что я полностью догадываюсь, как использовать функцию, и понятия не имею, что находится внутри оператора блока (потому что в документах (в то время) не сказано! (Бета 4 документы )) Хахахах! введите здесь описание изображения


person Albert Renshaw    schedule 23.07.2014    source источник
comment
Кто-то из вашего представителя должен знать, что такой вопрос должен включать подробную информацию о сбое и ошибке, а также соответствующий код.   -  person rmaddy    schedule 23.07.2014
comment
Вероятно, это бесполезно, потому что это предварительная версия. Не ожидайте, что это будет последняя итерация этой документации.   -  person esqew    schedule 23.07.2014
comment
@rmaddy На самом деле нет конкретной ошибки, приложение даже не может работать, потому что я вообще не знаю, как использовать эту функцию. Это приведет к сбою по той же причине, что и int j = 0.5;. Я неправильно использую функцию.   -  person Albert Renshaw    schedule 23.07.2014
comment
@rmaddy Добавил отчет об ошибке.   -  person Albert Renshaw    schedule 23.07.2014
comment
Метод requestSupplementaryLexiconWithCompletion принадлежит классу UIInputViewController, а не NSString.   -  person rmaddy    schedule 23.07.2014
comment
@rmaddy Итак, я здесь: i.stack.imgur.com/EobVV.png в файле UIInputViewController.m. Как сейчас работает UILexicon? Что входит в оператор блока? И как проверить орфографию в слове с ошибкой?   -  person Albert Renshaw    schedule 23.07.2014
comment
Во-первых, используйте завершение кода Xcode, чтобы получить правильный синтаксис параметра обработчика завершения. Это исправит ваши синтаксические ошибки. Во-вторых, я понятия не имею, как его использовать. Я не пишу пользовательскую клавиатуру.   -  person rmaddy    schedule 23.07.2014
comment
@rmaddy Спасибо, до сих пор не могу понять это с завершением кода.   -  person Albert Renshaw    schedule 23.07.2014
comment
С другой стороны, почему все голосуют за закрытие этого вопроса? Потому что никто не знает, как это сделать? Ха-ха, я думал, что в этом смысл этого сайта   -  person Albert Renshaw    schedule 23.07.2014
comment
Какую документацию вы считаете бесполезной и почему она не может вам помочь? Apple не сможет сделать документы более подходящими для ваших нужд, если вы не скажете им, что вам нужно. Вы можете сообщать о проблемах с документами с радаром точно так же, как и с программным обеспечением. И на каждой странице документации есть ссылка обратной связи в правом нижнем углу.   -  person rickster    schedule 23.07.2014
comment
@rickster Я не понимаю, как это реализовать. На самом деле нет никаких примеров в документации или в Интернете. developer.apple.com/library/prerelease/ios/documentation/UIKit/:   -  person Albert Renshaw    schedule 23.07.2014
comment
@rickster раздел requestSupplementaryLexiconWithCompletion: там, конечно же :)   -  person Albert Renshaw    schedule 23.07.2014


Ответы (1)


Я никогда не использовал эту функцию, но быстрый поиск в Интернете по запросу «UILexicon» привел меня к документации Apple; чтение и переход по ссылкам оттуда довольно быстро заполнили картину.

Руководство по программированию расширений приложений содержит краткое объяснение того, для чего нужны лексиконы:

Каждая пользовательская клавиатура (независимо от значения ее клавиши RequestsOpenAccess) имеет доступ к базовому словарю автокоррекции через UILexicon класс. Используйте этот класс вместе с лексиконом собственного дизайна, чтобы предоставлять предложения и автоисправления, когда пользователи вводят текст.

Нажав UILexicon< /a> ссылка на этой странице привела меня к справочному документу для этого класса, в котором объясняется, что это список пар терминов, предоставленный Apple, только для чтения. Каждая из его записей представляет собой UILexiconEntry объект — в документах для этого класса говорится, что он предоставляет userInput (то, что набрал пользователь, например, «ipad») и documentText (что заменить, например, «iPad»). Поскольку эти классы доступны только для чтения, из этого следует, что они, вероятно, не позволяют вам предоставлять свои собственные пары автокоррекции - как указано в документации, они предназначены для дополнения любой системы автокоррекции, которую вы реализуете.


На данный момент мне даже не нужно смотреть документ для requestSupplementaryLexiconWithCompletion:, чтобы понять, как его использовать: просто объявление говорит мне:

  • Это метод UIInputViewController, класса, который мне пришлось бы создать подклассом, чтобы создать пользовательскую клавиатуру. Где-то в этом подклассе я, вероятно, должен назвать его self.
  • Его возвращаемый тип — void, поэтому я не могу получить лексикон, назначив результат вызова requestSupplementaryLexiconWithCompletion переменной.
  • Он вызывает блок, который я предоставляю, передавая мне объект UILexicon в качестве параметра этого блока.
  • В нем есть такие слова, как «запрос» и «completionHander», поэтому он, вероятно, сделает что-то асинхронное, что займет некоторое время, и вызовет этот блок, когда это будет сделано.

Итак, я предполагаю, что если бы я писал пользовательскую клавиатуру, я бы вызвал этот метод на ранней стадии (возможно, в viewDidLoad) и спрятал UILexicon, который он предоставляет, чтобы я мог обратиться к нему позже, когда пользователь печатает. Что-то вроде этого:

@property UILexicon *lexicon;

- (void)viewDidLoad {
    [super viewDidLoad];
    [self requestSupplementaryLexiconWithCompletion:^(UILexicon *lexicon){
        self.lexicon = lexicon;
    }];
}

Поскольку неясно, сколько времени потребуется для завершения requestSupplementaryLexiconWithCompletion, в любом месте, где я использую self.lexicon, я должен проверить, не является ли это nil.


В Руководстве по программированию расширений для приложений в разделе "Функции клавиатуры, ожидаемые пользователями iOS" указано "Автоисправление и предложение" прямо перед тем, как сказать:

Вы можете решить, реализовывать такие функции или нет; нет специального API для какой-либо из только что перечисленных функций

Таким образом, похоже, что автоисправление — это то, что вы должны сделать сами, с вашим собственным пользовательским интерфейсом, который является частью представления, представленного вашим UIInputViewController. API Раздел Quick Start for Custom Keyboards в руководстве по программированию намекает на то, как это можно сделать: используйте documentContextBeforeInput, чтобы увидеть, что пользователь недавно набрал, deleteBackward, чтобы избавиться от него, и insertText:, чтобы вставить исправление .

person rickster    schedule 23.07.2014
comment
Привет, во-первых, большое спасибо за время, которое вы потратили на написание этого подробного ответа. На самом деле именно так я планировал использовать UILexicon, предполагая, что это своего рода NSDictionary. :) Я все еще не совсем уверен, что понимаю, как получить объект UILexicon. В UIInputViewController.m в viewDidLoad я что вызываю? UILexicon *theLexicon = (UILexicon *)[self requestSupplementaryLexiconWithCompletion:nil]; ? - person Albert Renshaw; 24.07.2014
comment
вы упомянули операторы блока, поэтому я знаю, что это не так, я просто не знаю, что поставить там, где я поставил nil ... что-то вроде ^() { }, верно? Я думаю, что эта часть является обработчиком завершения, но я до сих пор не знаю, как его форматировать, не получая ошибок в xCode. К сожалению, я также понятия не имею, куда включить раздел запроса. Это та часть, с которой я борюсь :) - person Albert Renshaw; 24.07.2014
comment
Ах, так ты не знаком с блоками. У Apple есть документ для этого. И я отредактирую свой ответ... - person rickster; 24.07.2014
comment
Спасибо! Итак, теперь у меня это работает, и у меня есть объект UILexicon... Я собираю записи и просматриваю строки, но когда я пишу небольшой цикл while, чтобы вернуть их все в журнал, просто чтобы убедиться, что у меня есть целый словарь. слов (ха-ха), он возвращает только 12 слов ... так как я должен использовать это для автокоррекции, как предполагают документы Apple? Всего около 15 слов, так что 99% слов с ошибками даже не будет в списке. --› код: i.stack.imgur.com/jzjS4.png - person Albert Renshaw; 26.07.2014
comment
Вы видели часть в документации (и даже название метода) о том, что он дополнительный? Регулярная автокоррекция четырех настраиваемой клавиатуры для реализации самой — это ваша возможность выделить свою клавиатуру среди других. Лексикон предназначен для предоставления исправлений для конкретных устройств, пользователей и ситуаций в дополнение к вашим собственным. - person rickster; 26.07.2014
comment
Действительно отличный ответ. Я только что наткнулся на UILexicon сегодня, и вы очень хорошо рассмотрели ключевые моменты. Стандартные функции клавиатуры, похоже, были исключены из пользовательского API клавиатуры iOS 8. Я думаю, что это большое упущение. Рискну предположить, что я открою библиотеку, чтобы исправить это. - person Daniel Brim; 11.09.2014