Est-il possible d'empêcher le clavier de licencier?

je me rends compte que c'est l'inverse de la plupart des posts, mais j'aimerais que le clavier de rester même si le 'clavier' est enfoncé.

spécifiquement, j'ai une vue avec deux UITextField S. Avec la méthode de délégation suivante

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
    return NO;
}

je suis en mesure de garder le clavier, même si l'utilisateur appuie sur le Done Touche sur le clavier ou tape n'importe où ailleurs sur l'écran à L'exception du bouton pesky keyboard down en bas à droite de clavier.

j'utilise cette vue comme une vue modale (bien que la vue soit associée à un ViewController qui est poussé dans un UINavigationController), donc il fonctionne vraiment mieux du point de vue de l'utilisateur de garder le clavier en place tout le temps. Si quelqu'un sait comment y parvenir, s'il vous plaît laissez-moi savoir! Merci!

UPDATE Toujours pas de solution! Lorsque Done est pressé, il déclenche textFieldShouldReturn, mais quand Dismiss le bouton est appuyé, il déclenche textFieldDidEndEditing. Je ne peut pas bloquer l' textField de la fin de l'édition ou de l' jamais s'en va. En quelque sorte, je veux vraiment avoir une méthode qui détecte l' Dismiss bouton et l'ignore. Si vous connaissez un moyen, veuillez m'éclairer!

24
demandé sur PengOne 2011-05-15 05:57:37
la source

6 ответов

il y a un moyen de le faire. Parce que UIKeyboard sous-classes UIWindow, la seule chose assez grande pour y entrer UIKeyboard's way est un autre UIWindow.

- (void)viewDidLoad {
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(coverKey) name:UIKeyboardDidShowNotification object:nil];
    [super viewDidLoad];
}

- (void)coverKey {
    CGRect r = [[UIScreen mainScreen] bounds];
    UIWindow *myWindow = [[UIWindow alloc] initWithFrame:CGRectMake(r.size.width - 50 , r.size.height - 50, 50, 50)];
    [myWindow setBackgroundColor:[UIColor clearColor]];
    [super.view addSubview:myWindow];
    [myWindow makeKeyAndVisible];
}

cela fonctionne sur les applications iPhone. N'ai pas essayé avec l'iPad. Vous devrez peut-être ajuster la taille de myWindow. En outre, je n'ai pas fait de gestion mem sur myWindow. Donc, pensez à le faire que, trop.

11
répondu Jacob Barnard 2011-08-02 02:43:20
la source

je pense que j'ai trouvé une bonne solution.

Ajouter un BOOL comme variable d'instance, appelons-le shouldBeginCalledBeforeHand

puis implémenter les méthodes suivantes:

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{
    shouldBeginCalledBeforeHand = YES;
    return YES;
}

- (BOOL)textFieldShouldEndEditing:(UITextField *)textField
{
    return shouldBeginCalledBeforeHand;
}

- (void)textFieldDidBeginEditing:(UITextField *)textField
{
    shouldBeginCalledBeforeHand = NO;
}

aussi bien que

- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    return NO;
}

pour empêcher le clavier de disparaître avec le bouton de retour. Le truc est qu'un changement de focus d'un champ Text à un autre déclenche un message textFieldShouldBeginEditing à l'avance. Si on appuie sur le bouton Annuler le clavier, cela ne se produit pas. Le drapeau est réinitialiser après un champ text a obtenu la mise au point.

6
répondu Nick Weaver 2011-05-18 21:24:54
la source

Vieux pas de solution parfaite

Je ne peux que penser à une solution pas parfaite. Pour écouter la notification UIKeyboardDidHideNotification et faire des textfields premier intervenant de nouveau. Cela déplacera le clavier hors de vue et de retour à nouveau. Vous pourriez garder une trace du textfield qui était le dernier premier répondant en écoutant UIKeyboardWillHideNotification et mettre l'accent sur elle dans le didHide.

[[NSNotificationCenter defaultCenter] addObserver:self 
                                         selector:@selector(keyboardDidHide:) 
                                             name:UIKeyboardDidHideNotification
                                           object:nil];

...

- (void)keyboardDidHide:(id)sender
{
    [myTextField becomeFirstResponder];
}
3
répondu Nick Weaver 2011-05-18 21:25:06
la source

pour iOS 9/10 et Swift 3, Utilisez ceci pour créer un rect qui chevauche le bouton "Hide keyboard"

override func viewDidLoad() {
    NotificationCenter.default.addObserver(self, selector: #selector(coverKey), name: .UIKeyboardDidShow, object: nil)
}

func coverKey() {
    if let keyboardWindow = UIApplication.shared.windows.last {
        let r = UIScreen.main.bounds
        let myWindow = UIWindow.init(frame: CGRect(x: r.size.width - 50 , y: r.size.height - 50, width: 50, height: 50))
        myWindow.backgroundColor = UIColor.clear
        myWindow.isHidden = false
        keyboardWindow.addSubview(myWindow)
        keyboardWindow.bringSubview(toFront: myWindow)
    }
} 

notez que ceci ajoute une vue secondaire à la fenêtre du clavier au lieu de la fenêtre principale

1
répondu pugrish 2017-02-23 14:17:26
la source

Essayez d'ajouter une coutume en haut du clavier bouton rejeter, de sorte que l'utilisateur ne sera pas en mesure d'onglet, le bouton supprimer. J'ai utilisé cette méthode dans une de mes applications.

- (void)addButtonToKeyboard {

    // create custom button
    UIButton *blockButton = [UIButton buttonWithType:UIButtonTypeCustom];
    blockButton.frame = //set the frame here, I don't remember the exact frame
    [blockButton setImage:[UIImage imageNamed:@"block_button.png"] forState:UIControlStateNormal];

    // locate keyboard view
    UIWindow *appWindows = [[[UIApplication sharedApplication] windows] objectAtIndex:1];
    UIView *keyboard;
    for (int i=0; i<[appWindows.subviews count]; i++) {
        keyboard = [appWindows.subviews objectAtIndex:i];
        // keyboard found, add the button
        if ([[keyboard description] hasPrefix:@"<UIPeripheralHost"] == YES && [self.textField isFirstResponder]) {
            [keyboard addSubview:doneButton];

        }
    }

}
0
répondu Nithin 2011-05-19 15:35:10
la source

Essayez ceci...

- (BOOL)textFieldShouldEndEditing:(UITextField *)textField{
   return NO;
}

Vous pouvez utiliser notification comme mentionné par Nick Weaver.

-2
répondu Pragnesh Dixit 2011-05-23 18:07:24
la source

Autres questions sur