Não é possível encontrar o teclado que suporta o tipo 4 para teclado iPhone-Portrait-NumberPad; usando 3876877096_Portrait_iPhone-Simple-Pad_Default


114

Baixei o iOS 8 Gold Master para iPhone e SDK.

Testei o aplicativo e ele funciona bem, exceto por uma coisa.

Eu tenho um campo de texto onde um teclado numérico aparecerá se o usuário quiser digitar algo, além disso, um botão personalizado é adicionado à área vazia quando o teclado aparece.

- (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];
            }
        }
    }

}

Isso estava funcionando bem até agora.

Em primeiro lugar, estou recebendo este aviso:

Não é possível encontrar o teclado que suporta o tipo 4 para teclado iPhone-Portrait-NumberPad; usando 3876877096_Portrait_iPhone-Simple-Pad_Default

então, esse botão personalizado também não está sendo exibido, o que acho por causa destas 2 linhas:

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

e

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

Alguma sugestão?

Respostas:


10

Eu também tive esse problema e encontrei a solução.

Abaixo está o código que funcionará para iOS 8.0 e também para as versões abaixo.

Eu testei no iOS 7 e 8.0 (Xcode versão 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;
    }
}

Espero que isto ajude.

Mas ainda estou recebendo este aviso:

Não é possível encontrar o teclado que suporta o tipo 4 para teclado iPhone-Portrait-NumberPad; usando 3876877096_Portrait_iPhone-Simple-Pad_Default

Ignorando este aviso, fiz funcionar. Por favor, deixe-me saber se você conseguir obter alívio deste aviso.


Funcionou muito bem para mim. Obrigado cara.
CRAZYSNAKE

Para addDoneButton ou removeDoneButton: stackoverflow.com/questions/26031798/… Eu executo o código acima em XCode-5.1.1 nos dispositivos iOS-6/7/8. Funcionando perfeitamente.
alishaik786

1
- (void) doneButton: (UIButton *) sender {NSLog (@ "fdsfdsdsf"); }
SampathKumar

Eu fiz todas essas ações, mas o botão Concluído não é clicável, você pode me ajudar?
SergStav

Com a versão mais recente do iOS 8.3 e superior, algo mudou e falha no código postado anteriormente. Eu adicionei a verificação para iOS 8.3 e superior, ela pode parar de funcionar para a versão futura do iOS. Verifique acima.
iGW de

143

Eu também tive esse problema depois de atualizar para o Xcode Beta mais recente. As configurações no simulador são atualizadas, portanto, o teclado do laptop (externo) foi detectado. Se você simplesmente pressionar:

Simulador iOS -> Hardware -> Teclado -> Conectar teclado de hardware

para que a entrada seja desmarcada, o teclado do software será exibido mais uma vez.


14
Provavelmente apertei Shift + Cmd + K por engano!
Eric

1
Simulador de iOS -> Hardware -> Teclado -> Conectar teclado do hardware desmarque e resolveu
EFE

Isso apenas ignora a verificação que gera o erro quando você está em um simulador - o bug e a troca de teclado ainda acontecerão no mundo real em dispositivos reais.
Zack

Se isso não funcionar, selecione Simulador -> Hardware -> Apagar todo o conteúdo e configurações.
Wimukthi Rajapaksha

1
Para a versão 11.5; Simulador iOS -> I / O -> Teclado -> Conectar teclado do hardware
miletliyusuf

40

O emulador tenta encontrar um teclado numérico no mac, mas ele não é encontrado (MacBook Pro, MacBook Air e teclado "normal / pequeno" não têm). Você pode desmarcar a opção Conectar teclado de hardware ou simplesmente ignorar a mensagem de erro, isso não terá nenhum efeito negativo no aplicativo.


16

Basta ir para

Simulador iOS -> Hardware -> Teclado -> Desmarque a opção Conectar teclado de hardware.

Isso vai resolver o problema.

Seu teclado MAC não funcionará após realizar a etapa acima. Você deve usar o teclado do simulador.


12

Estou usando o xcode com ios 8, basta desmarcar a opção conectar teclado de hardware em seu Simulador-> Hardware-> Teclado-> Conectar teclado de hardware.

Isso resolverá o problema.


Literalmente, não faço ideia de onde está esse simulador iOS. Ou onde está o hardware? Você está falando sobre o simulador real como a coisa que se parece com um iPhone, e através dele eu encontro hardware?
Thomas

7

Tive o mesmo problema no Xcode 8.1 e iOS 10.1. O que funcionou para mim foi acessar Simulador-> Hardware-> Teclado e desmarcar Conectar teclado de hardware.


7

Vá para Simulador-> Hardware-> Teclado e desmarque Conectar teclado de hardware.

O mesmo que muitas respostas acima, MAS não mudou para mim até eu sair e reiniciar o simulador. xcode 8.2.1 e Simulator 10.0.


5

Execute o aplicativo usando o simulador

Simulador iOS-> Hardware-> Teclado -> iOS usa o mesmo layout do OS X

Isso resolverá o problema se alguém estiver executando o aplicativo em seu dispositivo


3

Recebi a mesma mensagem de erro por dois motivos distintos, então você pode adicioná-los à sua lista de verificação de depuração:

Contexto: Xcode 6.4, iOS: 8.4. Eu estava adicionando uma barra de ferramentas com UIBarButtons personalizados para carregar com o UIKeyboardTypeNumberPad(Swift :) UIKeyboardType.numberPad, ou seja, "Concluído" e "+/-". Eu tive esse problema quando:

  1. Meu UIToolbar foi declarado como uma propriedade, mas eu tinha esquecido de alocá-lo / iniciá-lo explicitamente.

  2. Eu tinha deixado a última linha, [myCustomToolbar sizeToFit];que parece ser da mesma família da resposta de Holden (meu código aqui: https://stackoverflow.com/a/32016397/4898050 ).

Boa sorte


2

Em seu aplicativo iOS não é possível encontrar um teclado numérico conectado ao seu OS X. Portanto, você só precisa desmarcar a opção conectar teclado de hardware em seu simulador, no seguinte caminho apenas para fins de teste:

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

Isso resolverá o problema acima.

Eu acho que você deveria ver o link abaixo também. Ele diz que é uma bugna XCodeno final do que tópico no Fórum post!

Referência


1

Eu tive o mesmo problema ao usar o perfil de provisionamento de distribuição. Verifique se você usa o perfil de desenvolvedor


1

Por que o código longo e não usar o UIToolbar? já que o aviso ainda persiste?

UIToolbar está funcionando para qualquer versão do iOS aqui está meu código de exemplo

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];
}

0

Talvez você deva redefinir o frame do botão, eu tive alguns problemas também, e nslog a visualização do teclado assim:

iOS8:

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

before8:

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

-1

Ok, aqui está uma correção simples para obter o botão 'concluído' para mostrar e funcionar em um aplicativo no iOS 9, iOS 8 e inferior quando recebo um erro semelhante. Pode ser observado depois de executar um aplicativo e visualizá-lo via 'View's Hierarchy' (ou seja, clicar no ícone 'View Hierarchy' da barra Debug Area enquanto o aplicativo está sendo executado no dispositivo e inspecionar suas visualizações no Storyboard), que o teclado é apresentado diferentes janelas no iOS 9 em comparação com o iOS 8 e versões anteriores e devem ser consideradas. 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;
    }
}

E é assim que você pode remover oKeyboardButton do teclado, se quiser.

- (void)removeKeyboardButton {

id windowTemp = [self addButtonToKeyboard];

if (windowTemp) {

    for (UIView *doneButton in [windowTemp subviews]) {
        if ([doneButton isKindOfClass:[UIButton class]]) {
            [doneButton setHidden:TRUE];
        }
    }
  }
}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.