ios - tutorial - swift(lenguaje de programación)
¿Cómo descartar el teclado cuando el usuario toca otra área fuera del campo de texto? (12)
- Simplemente agregue un UITAPGestureRecogniser a su vista que lo llevará a llamar a
resignFirstResponder
En viewDidLoad:
UITapGestureRecognizer * tapGesture = [[UITapGestureRecognizer alloc]
initWithTarget:self
action:@selector(hideKeyBoard)];
[self.view addGestureRecognizer:tapGesture];
Y entonces :
-(void)hideKeyBoard {
[yourTextField resignFirstResponder];
}
2. Puedes subescribir UITextField, pero a menos que tengas 1000 textFields, puedes hacer lo mismo que haces actualmente.
hoy traté de ejecutar mi código en mi iPod (iOS 6.1.3) y encontré algo interesante aquí ...
primero, cuando toco en el campo de texto aparece el teclado pero no se oculta cuando toco en otro lugar fuera del campo de texto.
así que decidí buscar en Google y encontré esta solución:
_fieldEmail.delegate = self;
_fieldEmail.returnKeyType = UIReturnKeyDone;
_fieldPassword.delegate = self;
_fieldPassword.returnKeyType = UIReturnKeyDone;
_fieldRegisterName.delegate = self;
_fieldRegisterName.returnKeyType = UIReturnKeyDone;
_fieldRegisterEmail.delegate = self;
_fieldRegisterEmail.returnKeyType = UIReturnKeyDone;
_fieldRegisterPassword.delegate = self;
_fieldRegisterPassword.returnKeyType = UIReturnKeyDone;
funciona ... da un botón ''HECHO'' en la parte inferior del teclado y ahora el teclado se puede ocultar presionándolo.
pero tengo 2 problemas aquí:
- el teclado solo se oculta cuando se toca el botón ''HECHO''. no tocando otra área fuera del campo de texto. No sé si esto es normal en el mundo de iOS, pero generalmente veo muchas aplicaciones que no actúan así.
- ¿Hay alguna forma de repetir este proceso, así que no he agregado manualmente ese delegado uno por uno de todos los campos de texto que tengo? ¿como hacer eso?
Éso es Todo lo que Necesito Saber
Así es como lo hago:
En el archivo .h de myView:
@property (strong) UITextField * savedTextField;
En el archivo .m de myView:
@implementation myView
@synthesize savedTextField;
En la rutina de inicio de myView:
[self setSavedTextField: nil];
En el área delegada textField de myView, guardo el id de cualquier campo textField que esté activando actualmente:
- (BOOL) textFieldShouldBeginEditing: (UITextField *) textField
{
[self setSavedTextField: textField];
.
.
.
return( YES );
}
Y en la rutina de myView que enruta todo el tráfico para los otros controles cuando se accede, tengo un código que busca ver si un campo de texto estaba activo y, si era uno, lo llama para que renuncie a su estado de FirstResponder y luego descarta un nil en la propiedad savedTextField:
- (void) handleCtrlEvents: (UIControl *) aCtrl
{
if ( [self savedTextField] != nil )
{
[[self savedTextField] resignFirstResponder];
[self setSavedTextField: nil];
}
.
.
.
}
Esto funciona limpiamente para mí.
Descartar el teclado
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
[self.view endEditing:YES];
[super touchesBegan:touches withEvent:event];
}
El siguiente código funcionará en todos los componentes de UIView para todo el UITextField
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
for (UIView * txt in self.view.subviews){
if ([txt isKindOfClass:[UITextField class]] && [txt isFirstResponder]) {
[txt resignFirstResponder];
}
}
}
O
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
[self.view endEditing:YES];
}
Esto se refiere a la programación de Swift para Xcode 6.0.1
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(animated)
let tapRecognizer = UITapGestureRecognizer(target: self, action: "handleSingleTap:")
tapRecognizer.numberOfTapsRequired = 1
self.view.addGestureRecognizer(tapRecognizer)
}
func handleSingleTap(recognizer: UITapGestureRecognizer) {
self.view.endEditing(true)
}
Lo que suelo hacer es llamar
[field resignFirstResponder];
desde un botón invisible sobre la vista. Estoy seguro de que hay una manera más agradable de hacerlo. Ha pasado un tiempo desde que hice esto en una aplicación.
Me encontré con exactamente el mismo problema. Por lo general, lo que desea es que haga clic dentro de su aplicación (que se muestra en su UIView principal / actual) pero no en el teclado para cerrarla. Después de buscar en la web una solución inteligente y probar varias, creo que es lo mejor para extender / subclase / implementar UIGestureRecognizerDelegate
Dado que muchos controles como UITableView, etc. pueden responder a los gestos (seleccionar, desplazarse, etc.) y si simplemente agrega un UITapGestureRecognizer a la vista de ViewController (principal) para cerrar el teclado, la experiencia del usuario no es la mejor, ya que el usuario debe tocar dos veces si no tiene la intención de cerrar el teclado, pero, por ejemplo, seleccione una fila de una UITableView dentro de la vista "principal" actual de la aplicación.
Dado que soy bastante nuevo en todo el iOS y que los ejemplos de códigos rápidos son raros, aquí está mi control de teclado completo recortado:
class ViewController: UIViewController, UIGestureRecognizerDelegate {
override func viewDidLoad(){
self.initializeCloseKeyboardTap()
}
func initializeCloseKeyboardTap() {
NSNotificationCenter.defaultCenter().addObserver(self, selector: "onKeyboardOpen:", name: UIKeyboardDidShowNotification, object: nil)
NSNotificationCenter.defaultCenter().addObserver(self, selector: "onKeyboardClose:", name: UIKeyboardDidHideNotification, object: nil)
let tapRecognizer = UITapGestureRecognizer(target: self, action: "handleOnTapAnywhereButKeyboard:")
tapRecognizer.delegate = self //delegate event notifications to this class
self.view.addGestureRecognizer(tapRecognizer)
}
func onKeyboardClose(notification: NSNotification) {
println("keyboardClosed")
}
func onKeyboardOpen(notification: NSNotification) {
println("keyboardOpen")
}
func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldReceiveTouch touch: UITouch) -> Bool {
self.view.endEditing(true)
return false
}
puede anidarlo dentro de ViewController y llamar a initiallizeCloseKeyboardTa () en la implementación viewDidLoad ... También implementa un observador de normalización para recibir eventos tan pronto como el teclado (terminado para ser) se abra o se cierre mediante NSNotificationCenter UIKeyboardDidShowNotification y UIKeyboardDidHideNotification
Espero que otras personas salven en algún momento :-)
Sencillo,
Utilice IQKeyboardManager y coloque esta línea de código en AppDelegate.m
[[IQKeyboardManager sharedManager] setShouldResignOnTouchOutside:YES];
creo
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
es conveniente pero no la mejor solución. y el TapGestureRecongnizer es mejor pero es difícil de usar, debe establecer delegados y agregar y eliminar el Recongnizer. Así que escribí una subclase simple que se puede usar fácilmente:
class TapHideTextField: UITextField {
override func awakeFromNib() {
super.awakeFromNib()
tapGr = UITapGestureRecognizer(target: self, action:"tap")
NSNotificationCenter.defaultCenter().addObserver(self, selector: "didBeginEditing", name:UITextFieldTextDidBeginEditingNotification, object: nil)
NSNotificationCenter.defaultCenter().addObserver(self, selector: "didEndEditing", name:UITextFieldTextDidEndEditingNotification, object: nil)
}
deinit{
NSNotificationCenter.defaultCenter().removeObserver(self)
}
var tapGr:UITapGestureRecognizer!
func tap(){
self.endEditing(true)
}
func didBeginEditing(){
self.superview!.addGestureRecognizer(tapGr)
}
func didEndEditing(){
self.superview!.removeGestureRecognizer(tapGr)
}
}
Debería preocuparse por la supervista y la propiedad cancelTouchesInView.
o en GitHub: https://github.com/lilidan/TapHideText/blob/master/TapHideTextField.swift
| * | Descartar el teclado de UITextField: anular el método touchesBegan: withEvent: para ViewController
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?)
{
view.endEditing(true)
super.touchesBegan(touches, withEvent: event)
}
| O |
override func viewDidLoad()
{
super.viewDidLoad()
// For tapping outside text box
self.view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(DismisKeyPadFnc)))
}
// For tapping outside text box
func DismisKeyPadFnc()
{
view.endEditing(true)
}
| * | Descartar el teclado de UITextField en el cuadro de texto induvidual:
class NamVcc: UIViewController, UITextFieldDelegate
{
@IBOutlet var NamTxtBoxVid: UITextField!
override func viewDidLoad()
{
super.viewDidLoad()
// For hitting return key
NamTxtBoxVid.delegate = self
// For tapping outside text box
self.view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(DismisKeyPadFnc)))
}
/* For hitting return key */
func textFieldShouldReturn(NamTxtBoxPsgVid: UITextField) -> Bool
{
NamTxtBoxPsgVid.resignFirstResponder()
return true
}
/* For tapping outside text box */
func DismisKeyPadFnc()
{
view.endEditing(true)
}
}
| * | Implementando el botón Siguiente Haga clic en:
1) Necesitará configurar las etiquetas en la secuencia incremental de los campos de texto en xib / Storyboard o en el código.
2) Establezca el delegado para cada uno de los campos de texto.
3) Luego pegue el siguiente código en su controlador de vista para tener el efecto deseado:
func textFieldShouldReturn(TxtBoxPsgVar: UITextField) -> Bool
{
let NxtTxtBoxTagVal : Int = TxtBoxPsgVar.tag + 1
let NxtTxtBoxVal: UIResponder? = TxtBoxPsgVar.superview?.superview?.viewWithTag(NxtTxtBoxTagVal)
if let TxtBoxVal = NxtTxtBoxVal
{
// Found next responder, so set it.
TxtBoxVal.becomeFirstResponder()
}
else
{
// Not found, so remove keyboard.
TxtBoxPsgVar.resignFirstResponder()
}
return true
}
Utilizar cualquiera
UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)];
[self.view addGestureRecognizer:singleTap];
y código de método
-(void)handleSingleTap:(UITapGestureRecognizer *)sender{
[self.TextFiledName resignFirstResponder];
}
O _ Y la mejor opción es otra
Solo agrega
[self.view endEditing:YES];
Y el teclado se ocultará cuando toques en cualquier lugar desde la vista :)
-(void) textFieldDidBeginEditing: (UITextField *) textField{
[self.view addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(DismissKeyboard:)]];
}
-(void) DismissKeyboard:(UITapGestureRecognizer *) sender{
[self.view endEditing:YES];
[self.view removeGestureRecognizer:sender];
}