hig descargar custom ios iphone internationalization keyboard

ios - descargar - UITextInputMode currentInputMode está en desuso. ¿Reemplazo sugerido?



navigation ios (6)

En nuestra aplicación, nos gustaría detectar el idioma actual del teclado. Por ejemplo, si el usuario configura varios teclados de idiomas en Configuración-> General-> Teclado-> Teclados, nos gustaría saber en qué idioma están escribiendo y recibir 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 apropiada cuando el usuario alterna los teclados utilizando el icono de globo en el teclado, pero cuando iteramos los UITextInputModes, aparecen en el mismo orden sin indicación (aparente) de cuál es el actual, a menos que usemos el [UITextInputMode currentInputMode] ahora obsoleto.

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


Actualiza tu código así:

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


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

UITextInputMode *currentInputMode = [notification object];

Además, puede obtener el modo de entrada activo en un respondedor en particular:

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

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


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

Si sucede (como yo) que no tiene uno (p. Ej., Porque implementa un inputView y no tiene 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 Heap. Comparado con unos pocos bytes del código en UIKit-Library. Eso realmente tiene sentido ... :-)


[UIApplication sharedApplication].delegate.window.textInputMode

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


No creo que deba crear nuevos UITextView o UITextField .

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

Si tiene varias vistas de texto / campo y no sabe cuál está activo, puede invocar isFirstResponder en cada una. Pero parece que puede obtener textInputMode de cualquier control de texto 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