214 votes

clavier iPad ne fermeront pas si modal ViewController style de présentation est UIModalPresentationFormSheet

Note:

Voir accepté de répondre (pas top voté un) pour la solution de l'iOS 4.3.

Cette question est au sujet d'un comportement découvert dans l'iPad clavier, où il refuse d'être rejetée si elle est affichée dans une boîte de dialogue modale avec une manette de navigation.

En gros, si je présente la manette de navigation avec la ligne suivante comme ci-dessous:

navigationController.modalPresentationStyle = UIModalPresentationFormSheet;

Le clavier refuse d'être rejeté. Si je commente cette ligne, le clavier va bien.

...

J'en ai deux textFields, le nom d'utilisateur et mot de passe, nom d'utilisateur a un bouton "Suivant" et le mot de passe a un bouton Terminé. Le clavier ne va pas loin si je le présente dans une modal manette de navigation.

FONCTIONNE

broken *b = [[broken alloc] initWithNibName:@"broken" bundle:nil];
[self.view addSubview:b.view];

NE FONCTIONNE PAS

broken *b = [[broken alloc] initWithNibName:@"broken" bundle:nil];
UINavigationController *navigationController = 
[[UINavigationController alloc]
 initWithRootViewController:b];
navigationController.modalPresentationStyle = UIModalPresentationFormSheet;
navigationController.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
[self presentModalViewController:navigationController animated:YES];
[navigationController release];
[b release];

Si je débranche la manette de navigation de la partie et de présenter des " b " comme un modal-vue-contrôleur par lui-même, il fonctionne. Est la manette de navigation le problème?

FONCTIONNE

broken *b = [[broken alloc] initWithNibName:@"broken" bundle:nil];
b.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
[self presentModalViewController:b animated:YES];
[b release];

FONCTIONNE

broken *b = [[broken alloc] initWithNibName:@"broken" bundle:nil];
UINavigationController *navigationController = 
    [[UINavigationController alloc]
         initWithRootViewController:b];
[self presentModalViewController:navigationController animated:YES];
[navigationController release];
[b release];

172voto

Mike Weller Points 28387

Cela a été classé comme "fonctionne comme prévu" par les ingénieurs d'Apple. J'ai déposé un bug pour cela un moment de retour. Leur raisonnement est que l'utilisateur est souvent va être saisie de données dans un formulaire modal alors ils sont en train d'être "utile" et de garder le clavier visible où d'ordinaire les différentes transitions à l'intérieur de la modale de la vue peut provoquer le clavier pour afficher/masquer à plusieurs reprises.

edit: voici la réponse d'une Pomme ingénieur sur les forums des développeurs:

A votre avis, par hasard, présenté avec le UIModalPresentationFormSheet style? Pour éviter les fréquents dans et hors-les animations, le clavier, parfois, restent à l'écran, même quand il n'y a pas de premier répondant. Ce n'est pas un bug.

C'est donner beaucoup de les problèmes de quelqu'un (moi y compris), mais pour le moment il ne semble pas être un moyen de le contourner.

Mise à JOUR:

Dans iOS 4.3 ou version ultérieure, vous pouvez maintenant mettre en œuvre `-disablesAutomaticKeyboardDismissal " sur votre vue-contrôleur afin de NE retourner:

- (BOOL)disablesAutomaticKeyboardDismissal {
    return NO;
}

Cela résout le problème.

149voto

Miha Hribar Points 4121

Attention, si vous êtes en affichage modal avec un UINavigationController. Ensuite, vous devez définir l' disablesAutomaticKeyboardDismissal sur la manette de navigation et non sur la vue du contrôleur. Vous pouvez facilement le faire avec des catégories.

Fichier: UINavigationController+KeyboardDismiss.h

#import <Foundation/Foundation.h>

@interface UINavigationController (KeyboardDismiss)

- (BOOL)disablesAutomaticKeyboardDismissal;

@end

Fichier: UINavigationController+KeyboardDismiss.m

#import "UINavigationController+KeyboardDismiss.h"

@implementation UINavigationController(KeyboardDismiss)

- (BOOL)disablesAutomaticKeyboardDismissal
{
    return NO;
}

@end

Ne pas oublier d'importer de la catégorie dans le fichier où vous utilisez le UINavigationController.

115voto

Sebastian H Points 1036

Dans le viewController qui est présenté sous forme modale simplement remplacer disablesAutomaticKeyboardDismissal toujours PAS de retour

- (BOOL)disablesAutomaticKeyboardDismissal {
    return NO;
}

51voto

azdev Points 5691

J'ai résolu ce problème en utilisant le UIModalPresentationPageSheet style de présentation et de redimensionnement immédiatement après que je la présente. Comme suit:

viewController.modalPresentationStyle = UIModalPresentationPageSheet;
viewController.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
[self presentModalViewController:viewController animated:YES];
viewController.view.superview.autoresizingMask = 
    UIViewAutoresizingFlexibleTopMargin | 
    UIViewAutoresizingFlexibleBottomMargin;    
viewController.view.superview.frame = CGRectMake(
    viewController.view.superview.frame.origin.x,
    viewController.view.superview.frame.origin.y,
    540.0f,
    529.0f
);
viewController.view.superview.center = self.view.center;
[viewController release];

1voto

Adam Points 476

Si vous activez un autre modale de l'affichage vous pouvez obtenir le clavier à disparaître. Ce n'est pas assez et il n'a pas d'animer le bas, mais vous pouvez l'obtenir pour aller loin.

Ce serait formidable s'il y avait une solution, mais pour l'instant cela fonctionne. Vous pouvez le coincer dans une catégorie sur UIViewController et de l'appeler quand vous voulez que le clavier disparu:

@interface _TempUIVC : UIViewController
@end

@implementation _TempUIVC
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    return YES;
}
@end

@implementation UIViewController (Helpers)

- (void)_dismissModalViewController {
    [self dismissModalViewControllerAnimated:NO];
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardDidHideNotification object:nil];
    [self release];
}

- (void)forceKeyboardDismissUsingModalToggle:(BOOL)animated {
    [self retain];
    _TempUIVC *tuivc = [[_TempUIVC alloc] init];
    tuivc.modalPresentationStyle = UIModalPresentationCurrentContext;
    [self presentModalViewController:tuivc animated:animated];
    if (animated) {
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_dismissModalViewController) name:UIKeyboardDidHideNotification object:nil];
    } else
        [self _dismissModalViewController];
    [tuivc release];
}

@end

Soyez prudent avec cette même si, comme vous viewDidAppear / viewDidDisappear et toutes ces méthodes appelées. Comme je l'ai dit, c'est pas joli, mais ne fonctionne pas.

-Adam

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X