No se puede encontrar el plano de teclas que admita el tipo 4 para el teclado iPhone-Portrait-NumberPad; usando 3876877096_Portrait_iPhone-Simple-Pad_Default

114

Descargué iOS 8 Gold Master para iPhone y SDK.

Probé la aplicación y funciona bien, excepto por una cosa.

Tengo un campo de texto donde aparecerá un teclado numérico si el usuario quiere escribir algo, además, se agrega un botón personalizado al área vacía cuando aparece el teclado.

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

}

Esto estaba funcionando bien hasta ahora.

En primer lugar, recibo esta advertencia:

No se puede encontrar el plano de teclas que admita el tipo 4 para el teclado iPhone-Portrait-NumberPad; usando 3876877096_Portrait_iPhone-Simple-Pad_Default

entonces ese botón personalizado tampoco se muestra, lo cual creo que debido a estas 2 líneas:

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

y

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

¿Alguna sugerencia?

CRAZYSNAKE
fuente

Respuestas:

10

También tuve este problema y encontré la solución.

A continuación se muestra el código que funcionará para iOS 8.0 y también para las versiones siguientes.

Lo he probado en iOS 7 y 8.0 (Xcode versión 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 esto ayude.

Pero sigo recibiendo esta advertencia:

No se puede encontrar el plano de teclas que admita el tipo 4 para el teclado iPhone-Portrait-NumberPad; usando 3876877096_Portrait_iPhone-Simple-Pad_Default

Ignorando esta advertencia, lo hice funcionar. Por favor, avíseme si puede obtener alivio de esta advertencia.

iGW
fuente
Funcionó muy bien para mí. Gracias amigo.
CRAZYSNAKE
Para addDoneButton o removeDoneButton: stackoverflow.com/questions/26031798/… Ejecuto el código anterior en XCode-5.1.1 en los dispositivos iOS-6/7/8. Funcionando perfectamente.
alishaik786
1
- (void) doneButton: (UIButton *) remitente {NSLog (@ "fdsfdsdsf"); }
SampathKumar
Hice todas estas acciones pero no se puede hacer clic en el botón Hecho, ¿me pueden ayudar?
SergStav
Con la última versión de iOS 8.3 y superior, algo ha cambiado y falla el código publicado anteriormente. He agregado el cheque para iOS 8.3 y superior. Es posible que deje de funcionar para la futura versión de iOS. Por favor marque arriba.
iGW
143

Yo también tuve este problema después de actualizar a la última versión beta de Xcode. La configuración del simulador se actualiza, por lo que se detecta el teclado (externo) de la computadora portátil. Si simplemente presiona:

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

para que la entrada no esté marcada, el teclado del software se mostrará una vez más.

aquagremlin
fuente
14
¡Probablemente presioné Shift + Cmd + K por error!
Eric
1
Simulador de iOS -> Hardware -> Teclado -> Conectar teclado de hardware desmárquelo y se solucionó
EFE
Esto solo omite la verificación que arroja el error cuando estás en un simulador; el error y el cambio de teclado seguirán ocurriendo en el mundo real en dispositivos reales.
Zack
Si esto no funciona, seleccione Simulador -> Hardware -> Borrar todo el contenido y la configuración.
Wimukthi Rajapaksha
1
Para la versión 11.5; Simulador de iOS -> E / S -> Teclado -> Conectar teclado de hardware
miletliyusuf
40

El emulador intenta encontrar un teclado numérico en la Mac, pero no lo encuentra (MacBook Pro, MacBook Air y el teclado "normal / pequeño" no lo tienen). Puede anular la selección de la opción Conectar teclado de hardware o simplemente ignorar el mensaje de error, no tendrá ningún efecto negativo en la aplicación.

hombre oscuro
fuente
16

Solo ve a

Simulador de iOS -> Hardware -> Teclado -> Desmarque la opción Conectar teclado de hardware.

Esto solucionará el problema.

Su teclado MAC no funcionará después de realizar el paso anterior. Debe usar el teclado del simulador.

Avinash651
fuente
12

Estoy usando xcode con ios 8, simplemente desmarque la opción de conectar el teclado de hardware en su Simulador-> Hardware-> Teclado-> Conectar teclado de hardware.

Esto solucionará el problema.

usuario4600710
fuente
Literalmente, no tengo idea de dónde está este simulador de iOS. ¿O dónde está el hardware? ¿Estás hablando del simulador real como algo que parece un iPhone, y a través de eso encuentro hardware?
Thomas
7

Tuve el mismo problema en Xcode 8.1 y iOS 10.1. Lo que funcionó para mí fue ir a Simulador-> Hardware-> Teclado y desmarcar Conectar teclado de hardware.

carlson
fuente
7

Vaya a Simulador-> Hardware-> Teclado y desmarque Conectar teclado de hardware.

Lo mismo que muchas respuestas anteriores, PERO no cambiaron para mí hasta que salí y reinicié el simulador. xcode 8.2.1 y Simulator 10.0.

tdw
fuente
5

Ejecute la aplicación usando el simulador

iOS Simulator-> Hardware-> Keyboard -> iOS usa el mismo diseño que OS X

Esto solucionará el problema si alguien está ejecutando su aplicación en su dispositivo

Ronaldoh1
fuente
3

Recibí el mismo mensaje de error por dos motivos distintos, por lo que puede agregarlos a su lista de verificación de depuración:

Contexto: Xcode 6.4, iOS: 8.4. Estaba agregando una barra de herramientas con mensajes personalizados UIBarButtonpara cargar con UIKeyboardTypeNumberPad(Swift :) UIKeyboardType.numberPad, a saber, "Listo" y "+/-". Tuve este problema cuando:

  1. Mi UIToolbar se declaró como una propiedad, pero me había olvidado de asignar / init explícitamente.

  2. Había dejado la última línea, [myCustomToolbar sizeToFit];que parece que es la misma familia que la respuesta de Holden (mi código aquí: https://stackoverflow.com/a/32016397/4898050 ).

Buena suerte

AmitaiB
fuente
2

En su aplicación iOS no puede encontrar un teclado numérico conectado a su OS X. Por lo tanto, solo necesita desmarcar la opción Conectar teclado de hardware en su simulador, en la siguiente ruta solo para fines de prueba:

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

Esto resolverá el problema anterior.

Creo que también deberías ver el siguiente enlace. Se dice que es una bugde la XCodeal final de ese mensaje Foro hilo!

Referencia

Hitesh Surani
fuente
1

Tuve el mismo problema al usar el perfil de aprovisionamiento de distribución. Comprueba que utilizas el perfil de desarrollador

KIO
fuente
1

¿Por qué el código largo y no usar la UIToolbar? ya que la advertencia aún persiste?

UIToolbar está funcionando para cualquier versión de iOS aquí está mi código de muestra

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];
}
Feroz
fuente
0

Tal vez debería restablecer el marco del botón, yo también tuve algún problema, y ​​nslog la vista del teclado de esta manera:

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>>"
Holden
fuente
-1

De acuerdo, aquí hay una solución simple para hacer que el botón 'Listo' se muestre y funcione en una aplicación tanto en iOS 9, iOS 8 y versiones anteriores cuando recibí un error similar. Se podría observar después de ejecutar una aplicación y verla a través de 'Ver jerarquía' (es decir, hacer clic en el icono 'Ver jerarquía' de la barra del área de depuración mientras la aplicación se está ejecutando en el dispositivo e inspeccionar sus vistas en Storyboard), que el teclado se presenta en diferentes ventanas en iOS 9 en comparación con iOS 8 y versiones anteriores y deben tenerse en cuenta. 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;
    }
}

Y así es como puede eliminarKeyboardButton del teclado si lo desea.

- (void)removeKeyboardButton {

id windowTemp = [self addButtonToKeyboard];

if (windowTemp) {

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