Запретить пользовательскую клавиатуру в текстовом поле

Я экспериментировал с тем, как пользовательская клавиатура влияет на мое приложение. Я установил Swype на свой iPhone 6.

Я обнаружил, что в некоторых из моих представлений, где у меня есть пользовательское свойство inputView, установленное в текстовом поле, клавиатура Swype переопределяет и представляет вместо моего средства выбора. Это полностью нарушает мой пользовательский интерфейс и не может быть разрешено.

Есть ли способ явно указать iOS 8 использовать только тот inputView, который я установил?

Это баг, наверное? Это совсем не ожидаемое поведение, позволяющее третьей стороне переопределять мою спецификацию ввода?


person Dean Davids    schedule 24.09.2014    source источник
comment
Я столкнулся с точной проблемой с моим приложением. Я пробовал несколько пользовательских клавиатур, но проблема везде одинакова. Вы добились каких-либо успехов?   -  person Tariq    schedule 20.01.2015


Ответы (4)


Используя ответ Пабло Эсекьеля Ромеро в качестве отправной точки, я смог заставить все работать на меня. По сути, вместо того, чтобы использовать UIViewController для пользовательской клавиатуры, используйте UIInputViewController и поместите элементы управления в inputView UIInputViewController. Затем назначьте inputView вашего UITextField или UITextView на inputView UIInputViewController.

Если вы используете автоматическую компоновку, вам нужно убедиться, что вы все установили правильно, и убедитесь, что вы установили начальное ограничение высоты для inputView и установили его приоритет ниже максимального уровня 999 (я использовал 800). Подойдет любая высота; система заменит ваше ограничение своим собственным. Более низкий приоритет позволяет избежать конфликтов автоматической разметки. (Для меня, если бы я не включил это ограничение, окончательный вид вообще не имел бы высоты.)

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

person Craig Pearlman    schedule 27.07.2016

Вы можете отключить пользовательскую клавиатуру для своего приложения с помощью следующего кода:

включите это в свой делегат приложения:

- (BOOL)application:(UIApplication *)application shouldAllowExtensionPointIdentifier:(NSString *)extensionPointIdentifier {
    if ([extensionPointIdentifier isEqualToString: UIApplicationKeyboardExtensionPointIdentifier]) {
        return NO;
    }
    return YES;
}
person eertl    schedule 01.10.2014
comment
Спасибо. Это полезно знать и потенциально является решением. Хотя немного тяжеловат. Пользователи могут быть разочарованы, обнаружив, что предпочитаемая ими клавиатура отсутствует в моем приложении. Нет никаких причин, по которым пользовательские клавиатуры нельзя было бы использовать во многих случаях, только там, где я предоставил выделенный inputView, это проблема. - person Dean Davids; 02.10.2014
comment
Я сам столкнулся с этой проблемой, и это было быстрое решение. Моя основная проблема связана с представлением входа в систему, где пользовательским клавиатурам не разрешено устанавливать пароли, поэтому текстовое поле пароля никогда не показывает клавиатуру, когда пользователь нажимает «Далее» в поле имени пользователя. (поэтому, если у вас также есть логин или защищенное текстовое поле для ввода текста, проверьте это с помощью swype, чтобы увидеть, что это также не нарушит ваш пользовательский интерфейс) - person eertl; 03.10.2014
comment
@eertl: у меня другая проблема. Я знаю, что мы сможем отключить пользовательские клавиатуры iOS 8, используя приведенный выше фрагмент кода. Важным моментом здесь является то, что нам нужно использовать Xcode-6/iOS 8 SDK, чтобы использовать вышеперечисленное. Я все еще на Xcode 5 из-за некоторых других ограничений. Есть ли способ предотвратить использование сторонних клавиатур с помощью iOS 7 SDK/Xcode 5? Пожалуйста помоги. - person Rashmi Ranjan mallick; 29.10.2014
comment
1) Приведенный выше ответ - это то, что вы спросили @DeanDavids в первый раз, вы можете принять его :) 2) Сторонняя клавиатура не будет работать, если вы используете Xcode 5 и SDK7. - person TonyMkenu; 30.10.2014
comment
@TonyMkenu мое желание было больше направлено на предотвращение переопределения inputView или, точнее, пользовательского средства выбора для отдельных текстовых полей. Похоже, это было исправлено в выпущенных версиях iOS8, поэтому больше не является проблемой. Я бы принял ответ в сторону из-за побочных эффектов полного отключения выбора пользователей, которые я бы не нашел приемлемым. - person Dean Davids; 30.10.2014

Свифт 4

  func application(_ application: UIApplication, shouldAllowExtensionPointIdentifier extensionPointIdentifier: UIApplicationExtensionPointIdentifier) -> Bool {
        if (extensionPointIdentifier == .keyboard) {
            return false
        }
        return true
    }
person uplearnedu.com    schedule 19.08.2018

У меня была похожая проблема, и я смог исправить ее с помощью UIInputViewController. По сути, представление, которое я установил в inputView, — это представление моего подкласса UIInputViewController. Я использовал UIViewController, но после замены базового контроллера представления он стал работать хорошо.

person Pablo Romero    schedule 01.03.2016
comment
Пабло, я так и не решил полностью этот вопрос. Можно немного понятнее. Я не понимаю, что именно вы сделали. - person Dean Davids; 05.03.2016