>

Soporte a teclados externos en apps iOS

Siro Ramírez Losada     Colaboraciones    22/02/2019

Este artículo ha sido escrito por Pablo Carrascal

27 de enero de 2010, Steve Jobs sube al escenario del _Yerba Buena Center for the Arts_ de San Francisco para presentar la primera generación de un nuevo dispositivo, el iPad. Desde ese primer día, el iPad ha tenido gran importancia dentro del ecosistema de Apple, habiendo sufrido importantes cambios y variantes tanto en tamaño como en características técnicas, llegando a competir de tu a tu contra PC y Mac en algunos casos.

Cada generación de iPad venia acompañada de accesorios, entre ellos un teclado. Sin embargo, todos los modelos, incluyendo el original, son compatibles con teclados bluetooth. Si bien esto es cierto, no ha sido hasta estas últimas generaciones en las que, gracias al potente hardware y a las sucesivas mejoras en iOS, el iPad con teclado se convierte en una herramienta de trabajo.

teclado-ios

Desde el punto de vista de desarrollo, añadir soporte a tu applicación para teclados externos/bluetooth es sencillo, para ello usaremos las APIs de `UIResponder`.

Los objectos `responder`, que son instancias de `UIResponder`, constituyen la columna vertebral del manejo de eventos en `UIKit`. Las principales clases dentro de `UIKit` tales como `UIApplication`, `UIViewController` y `UIView` son tambien objetos `responder`. A medida que un evento ocurre, `UIKit` lo envia a los `responder` de la app para que lo traten.

En concreto, dentro de la variada API de `UIResponder`, para dar soporte a teclados externos nos interesa la variable `var keyCommands: [UIKeyCommand]?`, la cual representa los comandos de teclas que ejectutan una acción en ese `UIResponder`.

Cuando ocurre una combinación de teclas que encaja con un `keyCommand`, `UIKit` busca por la cadena de `responders` un objeto que encaje con esa combinación, después, llama al primer objeto que encuentra y para el procesamiento del evento.

Para crear un `UIKeyCommand` utilizaremos el inicializador `init(input: String, modifierFlags: UIKeyModifierFlags, action: Selector)`

siendo:

  • _input_: Identificador la tecla presionada.
  • _modifierFlags_: Teclas modificadoras tales como Shift, control…
  • _action_: Función a ejecutar
override var keyCommands: [UIKeyCommand]? {
		
	    let deleteInputKey: String = "\u{8}"
		        
        var keyCommands: [UIKeyCommand] = []
        
        keyCommands.append(
            UIKeyCommand(input: "\u{8}",
                         modifierFlags: [],
                         action: #selector(deleteKeyPressed),
                         discoverabilityTitle: "Delete")
        )
        
        
         keyCommands.append(          
             UIKeyCommand(input: UIKeyCommand.inputEscape,
                          modifierFlags: [],
                          action: #selector(escapeKeyPressed),
                          discoverabilityTitle: "Cancel")
         )
        
        
        return keyCommands
    }

La API de UIKeyCommand es muy variada y sencilla a la vez, permitiendo de manera rápida añadir incluso atajos de teclado:

override var keyCommands: [UIKeyCommand]? {
	var keyCommands: [UIKeyCommand] = []
	
	// Comando + Escape
	keyCommands.append(
		UIKeyCommand(input: UIKeyCommand.inputEscape",
		modifierFlags: [.command],
   		action: #selector(deleteKeyPressed),
		discoverabilityTitle: "Command + Escape")
	)
		
	return keyCommands
}

Si bien esta API es bastante potente y sencilla, tiene limitaciones, como por ejemplo saber cuando el usuario suelta una tecla.

Espero que habiendo mostrado lo facil que es añadir soporte para teclados externos en iOS, cada vez más aplicaciones se animen a soportarlo.