1

J'ai un contrôleur tableview sous un contrôleur de navigation. Certaines de mes cellules de tableau contiennent des champs de texte, donc quand j'appuie dessus, un clavier apparaît et redimensionne automatiquement (rétrécit) les limites de ma vue de table. Les limites sont ensuite restaurées lorsque le clavier est fermé par programmation en appelant resignFirstResponder sur mon champ de texte.Problème de redimensionnement d'une tableView lors de l'affichage d'une autre vue alors que le clavier est affiché

Certains de mes cellules pousserait un nouveau contrôleur de vue dans la pile de vue quand on tape, donc je suis démissionner de mon champ de texte actuel avant de pousser le contrôleur de vue:

- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
if (currentEditingTextField != nil) { 
    [currentEditingTextField resignFirstResponder]; 
    currentEditingTextField = nil; 
} 
return indexPath; 

}

Le problème est quand je retourne à ma vue de table, les limites de la vue de table sont dimensionnées comme si le clavier est toujours là. Je le sais parce que l'indicateur de défilement n'atteint juste au-dessus de l'endroit où se trouvait le clavier et qu'il y a un espace vide sous la vue de la table.

Quelqu'un l'a-t-il expérimenté et connaît-il une solution? Merci

+0

Vérifiez et voyez si vous devez recharger la vue de table juste après que vous ayez démissionné et avez fermé le clavier et juste avant que vous appuyiez sur le nouveau viewcontroller. – Jordan

Répondre

1

J'ai eu le même problème. J'ai trouvé que je dois empêcher l'appel [UIView viewWillDisappear:] avant que le clavier se cache.

Mes solutions pour cela.

// useful method, thus I don't need to remember current first responder 
@interface UIView (FindAndResignFirstResponder) 
- (BOOL)findAndResignFirstResonder; 
@end 

// --- 

@implementation UIView (FindAndResignFirstResponder) 
// http://stackoverflow.com/questions/1823317/how-do-i-legally-get-the-current-first-responder-on-the-screen-on-an-iphone 
- (BOOL)findAndResignFirstResonder { 
    if (self.isFirstResponder) { 
     return [self resignFirstResponder]; 
    } 
    for (UIView *subView in self.subviews) { 
     if ([subView findAndResignFirstResonder]) { 
      return YES; 
     } 
    } 
    return NO; 
} 
@end 

// --- 

@interface MyTableViewController : UITableViewController { 

    // some booleans required to track state of keyboard and view 
    BOOL hidingKeyboard; 
    BOOL viewWillDisappear; 
    BOOL viewWillDisappearAnimated; 

} 

// methods for keyboard event handling 
- (void)keyboardWillHide:(id)sender; 
- (void)keyboardDidHide:(id)sender; 

@end 

// --- 

@implementation MyTableViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    // adding observer for keyboard events (notifications) 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidHide:) name:UIKeyboardDidHideNotification object:nil]; 
    hidingKeyboard = NO; 
    viewWillDisappear = NO; 
} 

- (void)viewDidUnload { 
    [super viewDidUnload]; 

    // removing observer 
    [[NSNotificationCenter defaultCenter] removeObserver:self]; 
} 

- (void)viewWillDisappear:(BOOL)animated { 
    // finding and resigning first responder 
    [self.view findAndResignFirstResonder]; 

    if (hidingKeyboard) { 
     // if keyboard hide animation in process, 
     // remembering to run [super viewWillDisappear:] after keyboard hides 
     viewWillDisappear = YES; 
     viewWillDisappearAnimated = animated; 
    } else { 
     // if there is no keyboard hide animation, 
     // calling super immediately 
     [super viewWillDisappear:animated]; 
    } 
} 

- (void)keyboardWillHide:(id)sender { 
    hidingKeyboard = YES; 
} 

- (void)keyboardDidHide:(id)sender { 
    hidingKeyboard = NO; 

    if (viewWillDisappear) { 
     // calling [super viewWillAppear:] after keyboard hides, if required 
     viewWillDisappear = NO; 
     [super viewWillAppear:viewWillDisappearAnimated]; 
    } 
} 

@end 
Questions connexes