Impossible de trouver le clavier prenant en charge le type 4 pour le clavier iPhone-Portrait-NumberPad; en utilisant 3876877096_Portrait_iPhone-Simple-Pad_Default

114

J'ai téléchargé iOS 8 Gold Master pour l'iPhone et le SDK.

J'ai testé l'application et cela fonctionne bien, sauf pour une chose.

J'ai un champ de texte où un pavé numérique apparaîtra si l'utilisateur veut taper quelque chose, en plus, un bouton personnalisé est ajouté à la zone vide lorsque le clavier apparaît.

- (void)addButtonToKeyboard
{
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
    {
        // create custom button
        UIButton * doneButton = [UIButton buttonWithType:UIButtonTypeCustom];
        doneButton.frame = CGRectMake(-2, 163, 106, 53);
        doneButton.adjustsImageWhenHighlighted = NO;
        [doneButton setImage:[UIImage imageNamed:@"DoneUp.png"] forState:UIControlStateNormal];
        [doneButton setImage:[UIImage imageNamed:@"DoneDown.png"] forState:UIControlStateHighlighted];
        [doneButton addTarget:self action:@selector(saveNewLead:) forControlEvents:UIControlEventTouchUpInside];

        // locate keyboard view
        UIWindow * tempWindow = [[[UIApplication sharedApplication] windows]objectAtIndex:1];
        UIView* keyboard;
        for(int i=0; i<[tempWindow.subviews count]; i++) 
        {
            keyboard = [tempWindow.subviews objectAtIndex:i];

            // keyboard view found; add the custom button to it
            if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 3.2) {
                if([[keyboard description] hasPrefix:@"<UIPeripheralHost"] == YES)
                    [keyboard addSubview:doneButton];
            } else {
                if([[keyboard description] hasPrefix:@"<UIKeyboard"] == YES)
                    [keyboard addSubview:doneButton];
            }
        }
    }

}

Cela fonctionnait bien jusqu'à présent.

Tout d'abord, je reçois cet avertissement:

Impossible de trouver le clavier prenant en charge le type 4 pour le clavier iPhone-Portrait-NumberPad; en utilisant 3876877096_Portrait_iPhone-Simple-Pad_Default

alors ce bouton personnalisé ne s'affiche pas non plus, ce que je pense à cause de ces 2 lignes:

if([[keyboard description] hasPrefix:@"<UIPeripheralHost"] == YES)

et

if([[keyboard description] hasPrefix:@"<UIKeyboard"] == YES)

Aucune suggestion?

CRAZYSNAKE
la source

Réponses:

10

J'ai également eu ce problème et j'ai trouvé la solution.

Vous trouverez ci-dessous le code qui fonctionnera pour iOS 8.0 et également pour les versions ci-dessous.

Je l'ai testé sur iOS 7 et 8.0 (Xcode Version 6.0.1)

- (void)addButtonToKeyboard
    {
    // create custom button
    self.doneButton = [UIButton buttonWithType:UIButtonTypeCustom];
            //This code will work on iOS 8.3 and 8.4. 
       if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.3) {
            self.doneButton.frame = CGRectMake(0, [[UIScreen mainScreen]   bounds].size.height - 53, 106, 53);
      } else {
           self.doneButton.frame = CGRectMake(0, 163+44, 106, 53);
      }

    self.doneButton.adjustsImageWhenHighlighted = NO;
    [self.doneButton setTag:67123];
    [self.doneButton setImage:[UIImage imageNamed:@"doneup1.png"] forState:UIControlStateNormal];
    [self.doneButton setImage:[UIImage imageNamed:@"donedown1.png"] forState:UIControlStateHighlighted];

    [self.doneButton addTarget:self action:@selector(doneButton:) forControlEvents:UIControlEventTouchUpInside];

    // locate keyboard view
    int windowCount = [[[UIApplication sharedApplication] windows] count];
    if (windowCount < 2) {
        return;
    }

    UIWindow *tempWindow = [[[UIApplication sharedApplication] windows] objectAtIndex:1];
    UIView *keyboard;

    for (int i = 0; i < [tempWindow.subviews count]; i++) {
        keyboard = [tempWindow.subviews objectAtIndex:i];
             // keyboard found, add the button
          if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.3) {

            UIButton *searchbtn = (UIButton *)[keyboard viewWithTag:67123];
            if (searchbtn == nil)
                [keyboard addSubview:self.doneButton];

            } else {   
                if([[keyboard description] hasPrefix:@"<UIPeripheralHost"] == YES) {
              UIButton *searchbtn = (UIButton *)[keyboard viewWithTag:67123];
                   if (searchbtn == nil)//to avoid adding again and again as per my requirement (previous and next button on keyboard)
                [keyboard addSubview:self.doneButton];

        } //This code will work on iOS 8.0
        else if([[keyboard description] hasPrefix:@"<UIInputSetContainerView"] == YES) {

            for (int i = 0; i < [keyboard.subviews count]; i++)
            {
                UIView *hostkeyboard = [keyboard.subviews objectAtIndex:i];

                if([[hostkeyboard description] hasPrefix:@"<UIInputSetHost"] == YES) {
                    UIButton *donebtn = (UIButton *)[hostkeyboard viewWithTag:67123];
                    if (donebtn == nil)//to avoid adding again and again as per my requirement (previous and next button on keyboard)
                        [hostkeyboard addSubview:self.doneButton];
                }
            }
        }
      }
    }
 }

>

- (void)removedSearchButtonFromKeypad 
    {

    int windowCount = [[[UIApplication sharedApplication] windows] count];
    if (windowCount < 2) {
        return;
    }

    UIWindow *tempWindow = [[[UIApplication sharedApplication] windows] objectAtIndex:1];

    for (int i = 0 ; i < [tempWindow.subviews count] ; i++)
    {
        UIView *keyboard = [tempWindow.subviews objectAtIndex:i];

           if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.3){
                [self removeButton:keyboard];                  
            } else if([[keyboard description] hasPrefix:@"<UIPeripheralHost"] == YES) {
                  [self removeButton:keyboard];

             } else if([[keyboard description] hasPrefix:@"<UIInputSetContainerView"] == YES){

            for (int i = 0 ; i < [keyboard.subviews count] ; i++)
            {
                UIView *hostkeyboard = [keyboard.subviews objectAtIndex:i];

                if([[hostkeyboard description] hasPrefix:@"<UIInputSetHost"] == YES) {
                    [self removeButton:hostkeyboard];
                }
            }
        }
    }
}


- (void)removeButton:(UIView *)keypadView 
    {
    UIButton *donebtn = (UIButton *)[keypadView viewWithTag:67123];
    if(donebtn) {
        [donebtn removeFromSuperview];
        donebtn = nil;
    }
}

J'espère que cela t'aides.

Mais, je reçois toujours cet avertissement:

Impossible de trouver le clavier prenant en charge le type 4 pour le clavier iPhone-Portrait-NumberPad; en utilisant 3876877096_Portrait_iPhone-Simple-Pad_Default

Ignorant cet avertissement, je l'ai fait fonctionner. S'il vous plaît, faites-moi savoir si vous pouvez obtenir un soulagement de cet avertissement.

iGW
la source
A très bien fonctionné pour moi. Merci mon pote.
CRAZYSNAKE
Pour addDoneButton ou removeDoneButton: stackoverflow.com/questions/26031798 /... J'exécute le code ci-dessus dans XCode-5.1.1 dans les appareils iOS-6/7/8. Fonctionne parfaitement.
alishaik786
1
- (void) doneButton: (UIButton *) expéditeur {NSLog (@ "fdsfdsdsf"); }
SampathKumar
J'ai fait toutes ces actions mais le bouton Terminé n'est pas cliquable, pouvez-vous m'écouter?
SergStav
Avec la dernière version d'iOS 8.3 et au-dessus, quelque chose a changé qui échoue le code publié précédent. J'ai ajouté la vérification pour iOS 8.3 et supérieur, il peut cesser de fonctionner pour la future version iOS. Veuillez vérifier ci-dessus.
iGW
143

J'ai aussi eu ce problème après la mise à jour vers la dernière version bêta de Xcode. Les paramètres du simulateur sont actualisés, de sorte que le clavier (externe) de l'ordinateur portable a été détecté. Si vous appuyez simplement sur:

Simulateur iOS -> Matériel -> Clavier -> Connecter le clavier matériel

afin que l'entrée ne soit pas cochée, le clavier logiciel sera à nouveau affiché.

aquagremlin
la source
14
J'ai probablement frappé Shift + Cmd + K par erreur!
Eric le
1
Simulateur iOS -> Matériel -> Clavier -> Connecter le clavier matériel décochez-le et il est résolu
EFE
Cela ignore uniquement la vérification qui génère l'erreur lorsque vous êtes sur un simulateur - le bogue et l'échange de clavier se produiront toujours dans le monde réel sur des appareils réels.
Zack
Si cela ne fonctionne pas, sélectionnez Simulateur -> Matériel -> Effacer tout le contenu et les paramètres.
Wimukthi Rajapaksha le
1
Pour la version 11.5; Simulateur iOS -> E / S -> Clavier -> Connecter le clavier matériel
miletliyusuf
40

L'émulateur tente de trouver un pavé numérique sur le mac, mais celui-ci n'est pas trouvé (MacBook Pro, MacBook Air et le clavier «normal / petit» n'en ont pas). Vous pouvez désélectionner l'option Connecter le clavier matériel ou simplement ignorer le message d'erreur, cela n'aura aucun effet négatif sur l'application.

Homme sombre
la source
16

Allez simplement à

Simulateur iOS -> Matériel -> Clavier -> Décochez l'option Connecter le clavier matériel.

Cela résoudra le problème.

Votre clavier MAC ne fonctionnera pas après avoir effectué l'étape ci-dessus, vous devez utiliser le clavier du simulateur.

Avinash651
la source
12

J'utilise xcode avec ios 8, décochez simplement l'option de connexion du clavier matériel dans votre simulateur-> Matériel-> Clavier-> Connecter le clavier matériel.

Cela résoudra le problème.

user4600710
la source
Aucune idée de l'endroit où se trouve ce simulateur iOS. Ou où est le matériel? Vous parlez du simulateur réel comme la chose qui ressemble à un iPhone, et grâce à cela, je trouve du matériel?
Thomas
7

J'ai eu le même problème dans Xcode 8.1 et iOS 10.1. Ce qui a fonctionné pour moi était d'aller dans Simulator-> Hardware-> Keyboard et de décocher Connect Hardware Keyboard.

Carlson
la source
7

Allez dans Simulator-> Hardware-> Keyboard et décochez Connect Hardware Keyboard.

La même chose que de nombreuses réponses ci-dessus MAIS cela n'a pas changé pour moi jusqu'à ce que je quitte et redémarre le simulateur. xcode 8.2.1 et Simulator 10.0.

tdw
la source
5

Exécutez l'application à l'aide du simulateur

Simulateur iOS-> Matériel-> Clavier -> iOS utilise la même disposition que OS X

Cela résoudra le problème si quelqu'un exécute son application sur son appareil

Ronaldoh1
la source
3

J'ai reçu le même message d'erreur pour deux raisons distinctes, vous pouvez donc les ajouter à votre liste de contrôle de débogage:

Contexte: Xcode 6.4, iOS: 8.4. J'ajoutais une barre d'outils avec des UIBarButtons personnalisés à charger avec le UIKeyboardTypeNumberPad(Swift :) UIKeyboardType.numberPad, à savoir "Terminé" et "+/-". J'ai eu ce problème quand:

  1. Mon UIToolbar a été déclaré comme une propriété, mais j'avais oublié de l'allouer / l'initier explicitement.

  2. J'avais laissé la dernière ligne, [myCustomToolbar sizeToFit];ce qui semble être la même famille que la réponse de Holden (mon code ici: https://stackoverflow.com/a/32016397/4898050 ).

Bonne chance

AmitaiB
la source
2

Dans votre application iOS, vous ne trouvez pas de pavé numérique attaché à votre OS X. Il vous suffit donc de décocher l'option de connexion du clavier matériel dans votre simulateur, dans le chemin suivant uniquement à des fins de test:

Simulator -> Hardware -> Keyboard -> Connect Hardware Keyboard

Cela résoudra le problème ci-dessus.

Je pense que vous devriez également voir le lien ci-dessous. Il dit qu'il est un bugen XCodefin de ce fil après Forum!

Référence

Hitesh Surani
la source
1

J'ai eu le même problème en utilisant le profil d'approvisionnement de distribution. Vérifiez que vous utilisez le profil de développeur

KIO
la source
1

Pourquoi le code long et ne pas utiliser la UIToolbar? puisque l'avertissement persiste toujours?

UIToolbar fonctionne pour n'importe quelle version iOS, voici mon exemple de code

UIToolbar *doneToolbar = [[UIToolbar alloc] initWithFrame:(CGRect){0, 0, 50, 50}]; // Create and init
doneToolbar.barStyle = UIBarStyleBlackTranslucent; // Specify the preferred barStyle
doneToolbar.items = @[
[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil], 
[[UIBarButtonItem alloc] initWithTitle:@"Done" style:UIBarButtonItemStylePlain target:self action:@selector(doneEditAction)] // Add your target action
]; // Define items -- you can add more

yourField.inputAccessoryView = doneToolbar; // Now add toolbar to your field's inputview and run
[doneToolbar sizeToFit]; // call this to auto fit to the view

- (void)doneEditAction {
    [self.view endEditing:YES];
}
NFerocious
la source
0

Peut-être que vous devriez réinitialiser le cadre du bouton, j'ai aussi eu un problème, et nslog la vue du clavier comme ceci:

ios8:

"<UIInputSetContainerView: 0x7fef0364b0d0; frame = (0 0; 320 568); autoresize = W+H; layer = <CALayer: 0x7fef0364b1e0>>"

avant8:

"<UIPeripheralHostView: 0x11393c860; frame = (0 352; 320 216); autoresizesSubviews = NO; layer = <CALayer: 0x11393ca10>>"
Holden
la source
-1

OK, voici une solution simple pour obtenir le bouton `` terminé '' pour afficher et travailler dans une application à la fois sous iOS 9, iOS 8 et ci-dessous lorsque j'ai une erreur similaire. Il peut être observé après avoir exécuté une application et l'avoir visualisée via `` Afficher la hiérarchie '' (c'est-à-dire en cliquant sur l'icône `` Afficher la hiérarchie '' dans la barre de la zone de débogage pendant que l'application s'exécute sur l' appareil et en inspectant vos vues dans Storyboard), que le clavier est présenté sur différentes fenêtres dans iOS 9 par rapport à iOS 8 et versions inférieures et doivent être prises en compte. addButtonToKeyboard

- (id)addButtonToKeyboard
{
if (!doneButton)
{
   // create custom button
    UIButton * doneButton = [UIButton buttonWithType:UIButtonTypeCustom];
    doneButton.frame = CGRectMake(-2, 163, 106, 53);
    doneButton.adjustsImageWhenHighlighted = NO;
    [doneButton setImage:[UIImage imageNamed:@"DoneUp.png"] forState:UIControlStateNormal];
    [doneButton setImage:[UIImage imageNamed:@"DoneDown.png"] forState:UIControlStateHighlighted];
    [doneButton addTarget:self action:@selector(saveNewLead:) forControlEvents:UIControlEventTouchUpInside];
}

NSArray *windows = [[UIApplication sharedApplication] windows];
//Check to see if running below iOS 9,then return the second window which bears the keyboard   
if ([[[UIDevice currentDevice] systemVersion] floatValue] < 9.0) {
return windows[windows.count - 2];
}
else {
UIWindow* keyboardWithDoneButtonWindow = [ windows lastObject];
return keyboardWithDoneButtonWindow;
    }
}

Et voici comment vous pouvez supprimerKeyboardButton du clavier si vous le souhaitez.

- (void)removeKeyboardButton {

id windowTemp = [self addButtonToKeyboard];

if (windowTemp) {

    for (UIView *doneButton in [windowTemp subviews]) {
        if ([doneButton isKindOfClass:[UIButton class]]) {
            [doneButton setHidden:TRUE];
        }
    }
  }
}
Vick Swift
la source