UITextInputMode currentInputMode está en desuso. ¿Reemploop sugerido?

En nuestra aplicación, nos gustaría detectar el idioma actual del keyboard. Por ejemplo, si el usuario configura varios keyboards de idiomas en Configuración-> General-> Teclado-> Teclados, nos gustaría saber en qué idioma están escribiendo y para get una notificación de NSNotificationCenter cuando esto cambie.

- (void)viewDidLoad { [super viewDidLoad]; NSNotificationCenter *nCenter = [NSNotificationCenter defaultCenter]; [nCenter addObserver:self selector:@selector(languageChanged:) name:UITextInputCurrentInputModeDidChangeNotification object:nil]; [self languageChanged:nil]; } -(void)languageChanged:(NSNotification*)notification { for(UITextInputMode *mode in [UITextInputMode activeInputModes]) { NSLog(@"Input mode: %@", mode); NSLog(@"Input language: %@", mode.primaryLanguage); } NSLog(@"Notification: %@", notification); UITextInputMode *current = [UITextInputMode currentInputMode]; NSLog(@"Current: %@", current.primaryLanguage); } 

Lo que descubrimos con este código es que la notificación se activa de manera adecuada cuando el usuario alterna los keyboards con el ícono de globo en el keyboard, pero cuando iteramos los UITextInputModes, aparecen en el mismo order sin indicación (aparente) de cuál es el actual, a less que utilicemos el ahora en desuso [UITextInputMode currentInputMode].

No puedo encontrar ninguna documentation que indique la alternativa sugerida por Apple a esta funcionalidad ahora desechada. Hay varios subprocesss de OS que mencionan la desaprobación, pero ninguno que encontré con soluciones. ¿Algunas ideas? Gracias por adelantado.

El object para la notificación UITextInputCurrentInputModeDidChangeNotification es una instancia de UITextInputMode.

 UITextInputMode *currentInputMode = [notification object]; 

Además, puede get el modo de input activo en un respondedor particular:

 UITextView *textView = [[UITextView alloc] init]; UITextInputMode *currentInputMode = textView.textInputMode; 

Actualmente en iOS 7, el object textInputMode / notification es nulo para el keyboard emoji. No está claro si este es el comportamiento previsto.

La respuesta correcta pero estúpida es: use textInputMode en un UITextField que sea parte de view-hirarchy.

Si usted (como yo) no tiene uno (p. Ej., Porque implementa un inputView y no tiene una forma oficial de encontrar el primer respondedor), podría verse así:

 UTextField* p = [[UITextField alloc] init]; p.hidden = YES; [someView addSubview: p]; ... = p.textInputMode.primaryLanguage; [p removeFromSuperview]; 

Eso es tan obvio y simple y solo necesita 3 / 4KB de montón. En comparación con algunos bytes del código en la UIKit-Library. Eso realmente tiene sentido … 🙂

 [UIApplication shanetworkingApplication].delegate.window.textInputMode 

Funciona en ios9. No marcado en versiones anteriores de iOS.

No creo que UITextView crear un nuevo UITextView o UITextField .

Ya tienes uno si tu aplicación usa el keyboard. Simplemente obtenga .textInputMode.primaryLanguage desde su control de text existente.

Si tiene varias vistas / campo de text y no sabe, cuál está activo, puede llamar a isFirstResponder en cada uno. Pero parece que puede get textInputMode desde cualquier control de text y no necesita encontrar uno activo.

Swift 2.0

 //richT is the TextView or textField var language = richT.textInputMode?.primaryLanguage print("language: \(language)") //UITextInputMode().primaryLanguage - returns nil value 

Actualiza tu código de esta manera:

 NSArray *current = [UITextInputMode activeInputModes]; UITextInputMode *current = [current firstObject];