web-dev-qa-db-fra.com

Supprimer le clavier en touchant l'arrière-plan de UITableView

J'ai une UITableView avec UITextFields comme cellules. Je voudrais écarter le clavier lorsque l’arrière-plan de la variable UITableView est touché. J'essaie de le faire en créant une UIButton de la taille de UITableView et en la plaçant derrière la UITableView Le seul problème est que la UIButton capture toutes les touches, même lorsque celles-ci se trouvent sur UITableView. Qu'est-ce que je fais mal?

Merci!

97
Hua-Ying

Ceci est facilement fait en créant un UITapGestureRecognizer object (par défaut, cela détectera un "geste" lorsqu’un tapotement ne laissera aucune autre personnalisation nécessaire), en spécifiant une cible/action pour le moment où le geste est déclenché, puis en attachant. l'objet de reconnaissance de geste à votre vue de table.

Par exemple. Peut-être dans votre méthode viewDidLoad:

UITapGestureRecognizer *gestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(hideKeyboard)];
[self.tableView addGestureRecognizer:gestureRecognizer];

Et la méthode hideKeyboard pourrait ressembler à ceci:

- (void) hideKeyboard {
    [textField1 resignFirstResponder];
    [textField2 resignFirstResponder];
    ...
    ...
}

Notez que le geste n'est pas déclenché lorsque vous touchez un objet UITextField. Il est cependant déclenché sur l'arrière-plan UITableView, la vue de pied de page, la vue d'en-tête et sur UILabels à l'intérieur des cellules, etc.

197
mixja

La solution UITapGestureRecognizer fonctionne avec la sélection de cellules de tableau si vous définissez:

gestureRecognizer.cancelsTouchesInView = NO;
123
Azbuky

Voici une meilleure façon de faire ceci . Faites ceci simplement

[self.view endEditing:YES];

ou 

[[self.tableView superView] endEditing:YES];
61
Saad

Vous pouvez également le faire à partir de Storyboard:  enter image description here

50
Ben

Comme UITableView est une sous-classe de UIScrollView, l'implémentation d'une méthode de délégué ci-dessous constitue une solution extrêmement simple et rapide. Nul besoin même d'impliquer resignFirstResponder puisque la hiérarchie de vues introspecte et trouve le répondeur actuel et lui demande de quitter son statut. 

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
    [self.view endEditing:YES];
}

Et n'oubliez pas d'ajouter UIScrollViewDelegate au fichier d'en-tête. 

22
Rajive Jain

Tout d’abord, écoutez scrollViewWillBeginDragging dans votre UIViewController en ajoutant le UIScrollViewDelegate:

Dans le fichier .h:

@interface MyViewController : UIViewController <UIScrollViewDelegate> 

Dans le fichier .m:

- (void)scrollViewWillBeginDragging:(UIScrollView *)activeScrollView {

    [self dismissKeyboard];

}

Puis écoute d'autres interactions:

- (void)setupKeyboardDismissTaps {

    UISwipeGestureRecognizer *swipeUpGestureRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(dismissKeyboard)];
    swipeUpGestureRecognizer.cancelsTouchesInView = NO;
    swipeUpGestureRecognizer.direction = UISwipeGestureRecognizerDirectionUp;
    [self.tableView addGestureRecognizer:swipeUpGestureRecognizer];

    UISwipeGestureRecognizer *swipeDownGestureRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(dismissKeyboard)];
    swipeDownGestureRecognizer.cancelsTouchesInView = NO;
    swipeDownGestureRecognizer.direction = UISwipeGestureRecognizerDirectionDown;
    [self.tableView addGestureRecognizer:swipeDownGestureRecognizer];

    UISwipeGestureRecognizer *swipeLeftGestureRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(dismissKeyboard)];
    swipeLeftGestureRecognizer.cancelsTouchesInView = NO;
    swipeLeftGestureRecognizer.direction = UISwipeGestureRecognizerDirectionLeft;
    [self.tableView addGestureRecognizer:swipeLeftGestureRecognizer];

    UISwipeGestureRecognizer *swipeRightGestureRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(dismissKeyboard)];
    swipeRightGestureRecognizer.cancelsTouchesInView = NO;
    swipeRightGestureRecognizer.direction = UISwipeGestureRecognizerDirectionRight;
    [self.tableView addGestureRecognizer:swipeRightGestureRecognizer];


    UITapGestureRecognizer *tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismissKeyboard)];
    tapGestureRecognizer.cancelsTouchesInView = NO;
    [self.tableView addGestureRecognizer:tapGestureRecognizer];

}

Puis implémentez dismissKeyboard:

- (void)dismissKeyboard {

    NSLog(@"dismissKeyboard");

    [yourTextFieldPointer resignFirstResponder];

}

Et si, comme moi, vous vouliez ignorer le clavier pour un UITextField dans une cellule de tableau personnalisée:

- (void)dismissKeyboard {

    NSLog(@"dismissKeyboard");

    CustomCellClass *customCell = [tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]];
    [customCell.textFieldInCell resignFirstResponder]; 

}

J'espère que cela aide ceux qui cherchent!

12
bbeckford
tableView.keyboardDismissMode = .onDrag
9
Dom Bryan

Voici la version Swift pour votre plaisir de codage:

Il ajoute un dispositif de reconnaissance des gestes tactiles, puis ferme le clavier. Aucun point de vente pour TextField n'est requis!

override func viewDidLoad() {
    super.viewDidLoad()
    view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: "handleTap:"))
}

func handleTap(sender: UITapGestureRecognizer) {
    if sender.state == .Ended {
        view.endEditing(true)
    }
    sender.cancelsTouchesInView = false
}
7
Biodave

Je l'ai fait comme ça:

Créez une méthode dans votre TableViewController pour désactiver le premier répondant (qui serait votre zone de texte à ce moment-là)

- (BOOL)findAndResignFirstResonder:(UIView *)stView {
    if (stView.isFirstResponder) {
        [stView resignFirstResponder];
        return YES;     
    }

    for (UIView *subView in stView.subviews) {
        if ([self findAndResignFirstResonder:subView]) {
            return YES;
        }
    }
    return NO;
}

Dans tableView:didSelectRowAtIndexPath:, appelez la méthode précédente:

- (void)tableView:(UITableView *)tableView
                             didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    ...
    [self findAndResignFirstResonder: self.view];
    ...
}
7
sha

J'avais une UITableViewController et implémenter touchesBegan:withEvent: ne fonctionnait pas pour moi. 

Voici ce qui a fonctionné:

Rapide: 

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    view.endEditing(true)
}

Objectif c:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    [self.view endEditing:YES];
}
5
MontiRabbit

Il existe une version Swift 3 sans blocage des taps sur les cellules.

Dans la méthode viewDidLoad():

let dismissKeyboardGesture = UITapGestureRecognizer(target: self, action: #selector(hideKeyboard))
dismissKeyboardGesture.cancelsTouchesInView = false
tableView.addGestureRecognizer(dismissKeyboardGesture)

Et hideKeyboard ressemble à ceci:

func hideKeyboard() {
    view.endEditing(true)
}
4
Ivan Smetanin

Si vous ciblez iOS7, vous pouvez utiliser l'un des éléments suivants:

tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag;

tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeInteractive;

Le premier animera l’écran de désactivation du clavier lorsque la vue du tableau défilera et le second masquera le clavier comme l’application stock Messages.

Notez que ceux-ci proviennent de UIScrollView, dont UITableView hérite.

4
Joe Masilotti
@interface DismissableUITableView : UITableView {
}
@end

@implementation DismissableUITableView

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
 [self.superview endEditing:YES];
 [super touchesBegan:touches withEvent:event];
}

@end

Ensuite, assurez-vous que dans votre fichier Nib vous définissez le type de votre UITableView sur DismissableUITableView ..... peut-être aurais-je pu penser à un meilleur nom pour cette classe, mais vous comprenez le point.

4
bandejapaisa

UITableView est une sous-classe de UIScrollView. 

La façon dont je l'ai fait était d'écouter un événement de défilement de l'utilisateur, puis resignFirstResponder. Voici la méthode UIScrollViewDelegate à implémenter dans votre code;

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView

En abordant ce genre de problèmes, j'ai trouvé le meilleur moyen de rechercher les protocoles délégués pour chaque objet et ceux des classes parentes (ici, UITableViewDelegate, UIScrollViewDelegate. Le nombre d'événements déclenchés par les objets NS est relativement important. Il est également plus facile d’implémenter un protocole que de sous-classer quoi que ce soit.

2
pschang

J'ai eu le même problème et voici ma solution, cela fonctionne parfaitement pour moi:

Dans la vue ou le contrôleur de vue que vous avez implémenté <UITextFieldDelegate>

(Dans mon cas, j'ai une UITableViewCell personnalisée appelée TextFieldCell), 

Déclarez la UITapGestureRecognizer en tant que propriété:

@interface TextFieldCell : UITableViewCell <UITextFieldDelegate>
{
    UITextField *theTextField;
    UITapGestureRecognizer *gestureRecognizer;
}
@property (nonatomic,retain) UITextField *theTextField;
@property (nonatomic,retain) UITapGestureRecognizer *gestureRecognizer; 

Et initialisez-le dans votre vue/contrôleur:

self.gestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(closeKeyboard:)];

Dans la méthode - (void)textFieldDidBeginEditing:(UITextField *)textField, utilisez superView pour accéder à votre tableView et appelez addGestureRecognizer:

[self.superview.superview addGestureRecognizer:gestureRecognizer];

Et dans - (void)textFieldDidEndEditing:(UITextField *)textField, supprimez simplement le programme de reconnaissance de geste:

[self.superview.superview removeGestureRecognizer:gestureRecognizer];

J'espère que ça aide.

2
hac.jack

Je voulais que ma cellule ouvre le clavier lorsqu'une partie de la cellule est sélectionnée et le ferme si vous avez cliqué n'importe où hors de la cellule. Pour ouvrir le clavier:

- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
    [super setSelected:selected animated:animated];
    if (selected)
    {
        [self.textField becomeFirstResponder];
    }
}

(REMARQUE: j'ai sous-classé la cellule, mais vous pouvez facilement y parvenir dans la méthode de délégué tableView:didSelectRowAtIndexPath: de UITableView)

Cela signifiait qu'avec les meilleures solutions, si vous cliquiez deux fois sur la cellule, le clavier tremblait lorsque, tout d'abord, le programme de reconnaissance des gestes tentait de fermer le clavier et, deuxièmement, la cellule était resélectionnée et essayait d'ouvrir le clavier.

La solution consiste à vérifier si le clic s'est produit dans la cellule actuellement sélectionnée:

- (void)viewDidLoad
{
    [super viewDidLoad];
    //gesture recognizer to close the keyboard when user taps away
    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self
                                                                          action:@selector(dismissKeyboard:)];
    tap.cancelsTouchesInView = NO;
    [self.tableView addGestureRecognizer:tap];
}

-(void)dismissKeyboard:(UIGestureRecognizer*)tapGestureRecognizer
{
    if (!CGRectContainsPoint([self.tableView cellForRowAtIndexPath:[self.tableView indexPathForSelectedRow]].frame, [tapGestureRecognizer locationInView:self.tableView]))
    {
        [self.view endEditing:YES];
    }
}
2
Sam

J'ai trouvé une solution qui fonctionne très bien.

Est nécessaire pour utiliser UIGestureRecognizerDelegate et la méthode - gestureRecognizer: shouldReceiveTouch: .

Ajoutez la reconnaissance de geste à la vue tableau comme suit: 

UITapGestureRecognizer *tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(hideKeyboard)];
tapGestureRecognizer.cancelsTouchesInView = NO;
tapGestureRecognizer.delegate = self;
[self.suggestedTableView addGestureRecognizer:tapGestureRecognizer];
[tapGestureRecognizer release];

Ensuite, implémentez la méthode shouldReceiveTouch delegate pour rejeter les contacts effectués dans la classe UITableViewCell. La méthode hideKeyboard uniquement sera appelée lorsque le toucher aura été effectué en dehors de la classe UITableViewCell.

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
    if([touch.view isKindOfClass:[UITableViewCell class]]) {
        return NO;
    }
    // UITableViewCellContentView => UITableViewCell
    if([touch.view.superview isKindOfClass:[UITableViewCell class]]) {
        return NO;
    }
    // UITableViewCellContentView => UITableViewCellScrollView => UITableViewCell
    if([touch.view.superview.superview isKindOfClass:[UITableViewCell class]]) {
        return NO;
    }
    return YES; // handle the touch
}

- (void) hideKeyboard{
    [textField resignFirstResponder];
}
2
mlabraca

Le simple fait d'utiliser UITapGestureRecognizer et cancelsTouchesInView = NO signifie que les taps sur les cellules et UITextViews déclenchent également le masquage. C'est mauvais si vous avez plusieurs UITextViews et que vous appuyez sur le suivant. Le clavier commence à se cacher, puis la textView suivante devient le premier répondeur et le clavier redevient visible. Pour éviter cela, vérifiez l'emplacement du tap et masquez le clavier uniquement si le tap n'est pas sur une cellule:

// init
UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(didTapTableView:)];
tapRecognizer.cancelsTouchesInView = NO;
[self.tableView addGestureRecognizer:tapRecognizer];


// Hide on tap
- (void)didTapTableView:(UITapGestureRecognizer *)tap
{
    CGPoint point = [tap locationInView:tap.view];
    [self.view endEditing:!CGRectContainsPoint([self.tableView rectForRowAtIndexPath:[self.tableView indexPathForRowAtPoint:point]], point)];
}

Pour que scrollViewWillBeginDragging: soit déclenché, la propriété scrollEnabled de tableView doit être YES

// Hide on scroll
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
    [self.view endEditing:YES];
}
1
Shawn Throop

Je cherchais la solution et je n'ai rien trouvé qui corresponde à mon code. Je l'ai donc fait comme ceci:

http://82517.tumblr.com/post/13189719252/dismiss-keyboard-on-uitableview-non-cell-tap

Il s’agit essentiellement d’une combinaison d’approches précitées, mais ne nécessite aucune sous-classe ni la création de boutons en arrière-plan.

1
Miro Hudak

Beaucoup de réponses intéressantes. Je souhaiterais intégrer différentes approches dans la solution qui, à mon avis, conviendrait le mieux à un scénario UITableView (celui que j’utilise habituellement): Éléments d'interface utilisateur, ou en faisant défiler UITableView. Le premier scénario peut facilement être ajouté via un TapGestureRecognizer, et le second via la méthode UIScrollViewDelegate scrollViewWillBeginDragging: .. ... Premier ordre de travail, la méthode pour masquer le clavier:

   /**
     *  Shortcut for resigning all responders and pull-back the keyboard
     */
    -(void)hideKeyboard
    {
        //this convenience method on UITableView sends a nested message to all subviews, and they resign responders if they have hold of the keyboard
        [self.tableView endEditing:YES];

    }

Cette méthode annule toute interface utilisateur textField des sous-vues de la hiérarchie de vues UITableView. Il est donc plus pratique de renoncer à chaque élément indépendamment.

Ensuite, nous nous occupons du licenciement via un geste Tap extérieur, avec:

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    [self setupKeyboardDismissGestures];

}

- (void)setupKeyboardDismissGestures
{

//    Example for a swipe gesture recognizer. it was not set-up since we use scrollViewDelegate for dissmin-on-swiping, but it could be useful to keep in mind for views that do not inherit from UIScrollView
//    UISwipeGestureRecognizer *swipeUpGestureRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(hideKeyboard)];
//    swipeUpGestureRecognizer.cancelsTouchesInView = NO;
//    swipeUpGestureRecognizer.direction = UISwipeGestureRecognizerDirectionUp;
//    [self.tableView addGestureRecognizer:swipeUpGestureRecognizer];

    UITapGestureRecognizer *tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(hideKeyboard)];
    //this prevents the gestureRecognizer to override other Taps, such as Cell Selection
    tapGestureRecognizer.cancelsTouchesInView = NO;
    [self.tableView addGestureRecognizer:tapGestureRecognizer];

}

Définir tapGestureRecognizer.cancelsTouchesInView sur NO permet d'éviter que le gestureRecognizer ne remplace le fonctionnement interne normal de UITableView (par exemple, pour ne pas interférer avec la sélection de cellule).

Enfin, pour gérer le masquage du clavier lors du défilement vers le haut de UITableView, nous devons implémenter la méthode scrollViewWillBeginDragging: du protocole UIScrollViewDelegate, en tant que:

fichier .h

@interface MyViewController : UIViewController <UIScrollViewDelegate>

fichier .m

#pragma mark - UIScrollViewDelegate

-(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
    [self hideKeyboard];
}

J'espère que ça aide! =)

0
Robertibiris

Essaye ça:

viewDidLoad(){

    let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(dismissKeyboard))

    tableView.addGestureRecognizer(tap)

}
//Calls this function when the tap is recognized.
@objc func dismissKeyboard() {

    //Causes the view (or one of its embedded text fields) to resign the first responder status.
    view.endEditing(true)

}
0
Michael Colonna

UITableView a une propriété pratique backgroundView avec laquelle j'ai obtenu ce comportement sans toucher à la sélection de cellules, comme illustré ci-dessous dans Swift:

let tableBackTapRecognizer = UITapGestureRecognizer(target: self, action: #selector(hideKeyboard))
tableView.backgroundView = UIView()
tableView.backgroundView?.addGestureRecognizer(tableBackTapRecognizer)
0
Şafak Gezer

Si vous voulez fermer le clavier alors que vous appuyez sur la touche de retour, vous pouvez simplement ajouter le code suivant dans textField. La méthode retournée est la suivante: 

- (BOOL)textFieldShouldReturn:(UITextField *)atextField
{
   [textField resignFirstresponder];
}

Certains champs de texte peuvent avoir une vue de sélecteur ou une autre sous-vue. Par conséquent, dans ce cas, la méthode ci-dessus ne fonctionne pas. Dans ce cas, nous devons utiliser la classe UITapGestureRecognizer, c.-à-d. Ajouter l'extrait de code suivant à la méthode viewDidLoad, c.-à-d .::

UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self
                                                                          action:@selector(dismissKeyboard)];

    [self.view addGestureRecognizer:tap];

Ajoutez maintenant le répondeur démissionnaire à la méthode de sélection c’est-à-dire:

-(void)dismissKeyboard 
{
    [textField resignFirstResponder];
}

J'espère que ça aide, merci :)

0
Eshwar Chaitanya

Pourquoi voulez-vous créer une table pleine de champs de texte? Vous devez utiliser une vue détaillée pour chaque ligne contenant les champs de texte . Lorsque vous appuyez sur votre vue détaillée, veillez à appeler "[monTextField devientFirstResponder]" afin que l'utilisateur puisse commencer à modifier en un clic seulement liste.

0
Mugunth

La réponse de @ mixca est très utile, mais que se passe-t-il si j'ai quelque chose de différent de UITextField. Je pense que la meilleure façon de le gérer en recherchant toutes les sous-vues de la vue principale avec la fonction récursive, vérifiez l'exemple ci-dessous

- (BOOL)findAndResignFirstResponder {
if (self.isFirstResponder) {
    [self resignFirstResponder];
    return YES;
}

    for (UIView *subView in self.subviews) {
        if ([subView findAndResignFirstResponder]) {
            return YES;
        }
    }
    return NO;
}

vous pouvez aussi utiliser cette méthode dans votre classe d’utilitaires et utiliser un geste de tapotement comme la réponse de @ mixca.

0
mert

Si vous voulez sous-classer (ugh!) Votre vue de table, quelque chose comme ceci pourrait fonctionner:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {

   BOOL backgroundTouched = YES;

   for (UITouch *touch in touches) {
      CGPoint location = [touch locationInView:self];
      for (UITableViewCell *cell in self.visibleCells) {
         if (CGRectContainsPoint(cell.frame, location)) {
            backgroundTouched = NO;
            break;
         }
      }
   }

   if (backgroundTouched) {
      for (UITableViewCell *cell in self.visibleCells) {
         // This presumes the first subview is the text field you want to resign.
         [[cell.contentView.subviews objectAtIndex:0] resignFirstResponder];
      }
   }

   [super touchesBegan:touches withEvent:event];
}
0
Joe D'Andrea

Voici comment j'ai finalement fait des œuvres. J'ai combiné les suggestions et les codes de différentes réponses . Caractéristiques: suppression du clavier, déplacement des champs de texte au-dessus du clavier lors de l'édition et définition des types de retour du clavier "Suivant" et "Terminé".

static const CGFloat ANIMATION_DURATION = 0.4;
static const CGFloat LITTLE_SPACE = 5;
CGFloat animatedDistance;
CGSize keyboardSize;

@interface ViewController () <UITextFieldDelegate>
 @property (weak, nonatomic) IBOutlet UITextField *firstNameTXT;
  .....// some other text fields
 @property (weak, nonatomic) IBOutlet UITextField *emailTXT;
@end

@implementation ViewController
- (void)viewDidLoad{
.....
// add tap gesture to help in dismissing keyboard
UITapGestureRecognizer * tapGesture = [[UITapGestureRecognizer alloc]
                                       initWithTarget:self
                                       action:@selector(tapScreen:)];// outside textfields

[self.view addGestureRecognizer:tapGesture];

// set text fields return key type to Next, last text field to Done
[self.firstNameTXT setReturnKeyType:UIReturnKeyNext];
.....
[self.emailTXT setReturnKeyType:UIReturnKeyDone];

// set text fields tags
[self.firstNameTXT setTag:0];
....// more text fields
[self.emailTXT setTag:5];

// add keyboard notification
[[NSNotificationCenter defaultCenter] addObserver:self     selector:@selector(keyboardDidShow:) name:UIKeyboardDidShowNotification object:nil];
}
[[NSNotificationCenter defaultCenter] addObserver:self      selector:@selector(keyboardDidHide:) name:UIKeyboardDidHideNotification object:nil];
}

// dismiss keyboard when tap outside text fields
- (IBAction)tapScreen:(UITapGestureRecognizer *)sender {
  if([self.firstNameTXT isFirstResponder])[self.firstNameTXT resignFirstResponder];
  ...
  if([self.emailTXT isFirstResponder])[self.emailTXT  resignFirstResponder];

  }
- (BOOL)textFieldShouldReturn:(UITextField *)textField{
   if(textField.returnKeyType==UIReturnKeyNext) {
     // find the text field with next tag
     UIView *next = [[textField superview] viewWithTag:textField.tag+1];
     [next becomeFirstResponder];
   } else if (textField.returnKeyType==UIReturnKeyDone || textField.returnKeyType==UIReturnKeyDefault) {
    [textField resignFirstResponder];
 }
return YES;
}

// Moving current text field above keyboard
-(BOOL) textFieldShouldBeginEditing:(UITextField*)textField{
   CGRect viewFrame = self.view.frame;
   CGRect textFieldRect = [self.view.window convertRect:textField.bounds fromView:textField];
   CGRect viewRect = [self.view.window convertRect:self.view.bounds fromView:self.view];
   CGFloat textFieldBottomLine = textFieldRect.Origin.y + textFieldRect.size.height + LITTLE_SPACE;//

   CGFloat keyboardHeight = keyboardSize.height;

   BOOL isTextFieldHidden = textFieldBottomLine > (viewRect.size.height - keyboardHeight)? TRUE :FALSE;
  if (isTextFieldHidden) {
    animatedDistance = textFieldBottomLine - (viewRect.size.height - keyboardHeight) ;
    viewFrame.Origin.y -= animatedDistance;
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationBeginsFromCurrentState:YES];
    [UIView setAnimationDuration:ANIMATION_DURATION];
    [self.view setFrame:viewFrame];
    [UIView commitAnimations];
  }
  return YES;
}

-(void) restoreViewFrameOrigionYToZero{
  CGRect viewFrame = self.view.frame;
  if (viewFrame.Origin.y != 0) {
    viewFrame.Origin.y = 0;
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationBeginsFromCurrentState:YES];
    [UIView setAnimationDuration:ANIMATION_DURATION];
    [self.view setFrame:viewFrame];
    [UIView commitAnimations];
  }
}

-(void)keyboardDidShow:(NSNotification*)aNotification{
   NSDictionary* info = [aNotification userInfo];
   keyboardSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;
 }

-(void)keyboardDidHide:(NSNotification*)aNotification{
   [self restoreViewFrameOrigionYToZero];// keyboard is dismissed, restore frame view to its  zero Origin
}
@end
0
Kamel