Не удалось найти клавиатуру, которая поддерживает тип 4 для клавиатуры iPhone-Portrait-NumberPad; с использованием 3876877096_Portrait_iPhone-Simple-Pad_Default


114

Я загрузил iOS 8 Gold Master для iPhone и SDK.

Я протестировал приложение, и оно работает нормально, за исключением одного момента.

У меня есть текстовое поле, в котором отображается цифровая клавиатура, если пользователь хочет что-то напечатать, кроме того, при появлении клавиатуры в пустую область добавляется настраиваемая кнопка.

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

}

До сих пор это работало нормально.

Прежде всего, я получаю предупреждение:

Не удалось найти клавиатуру, которая поддерживает тип 4 для клавиатуры iPhone-Portrait-NumberPad; с использованием 3876877096_Portrait_iPhone-Simple-Pad_Default

тогда эта настраиваемая кнопка также не отображается, что, как я думаю, из-за этих двух строк:

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

и

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

Какие-либо предложения?

Ответы:


10

У меня тоже была эта проблема, и я нашел решение.

Ниже приведен код, который будет работать для iOS 8.0, а также для версий ниже.

Я тестировал его на iOS 7 и 8.0 (Xcode версии 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;
    }
}

Надеюсь это поможет.

Но я все еще получаю это предупреждение:

Не удалось найти клавиатуру, которая поддерживает тип 4 для клавиатуры iPhone-Portrait-NumberPad; с использованием 3876877096_Portrait_iPhone-Simple-Pad_Default

Игнорируя это предупреждение, я заработал. Пожалуйста, дайте мне знать, сможете ли вы избавиться от этого предупреждения.


Отлично сработал для меня. Спасибо друг.
CRAZYSNAKE

Для addDoneButton или removeDoneButton: stackoverflow.com/questions/26031798/… Я запускаю приведенный выше код в XCode-5.1.1 на устройствах iOS-6/7/8. Работает отлично.
alishaik786

1
- (void) doneButton: (UIButton *) отправитель {NSLog (@ "fdsfdsdsf"); }
SampathKumar

Я выполнил все эти действия, но кнопка «Готово» не нажимается, вы можете мне помочь?
SergStav

В последней версии iOS 8.3 и выше что-то изменилось, что не соответствует предыдущему опубликованному коду. Я добавил проверку для iOS 8.3 и выше, она может перестать работать в будущей версии iOS. Пожалуйста, проверьте выше.
iGW

143

У меня тоже была эта проблема после обновления до последней бета-версии Xcode. Настройки в симуляторе обновлены, поэтому обнаружена клавиатура ноутбука (внешняя). Если вы просто нажмете:

Симулятор iOS -> Оборудование -> Клавиатура -> Подключить аппаратную клавиатуру

так что запись не отмечена, тогда программная клавиатура будет отображаться снова.


14
Я, наверное, по ошибке нажал Shift + Cmd + K!
Эрик

1
Симулятор iOS -> Аппаратное обеспечение -> Клавиатура -> Подключить аппаратную клавиатуру, снимите отметку с него, и он решен
EFE

Это пропускает только проверку, которая вызывает ошибку, когда вы находитесь на симуляторе - ошибка и смена клавиатуры все равно будут происходить в реальном мире на реальных устройствах.
Zack

Если это не сработает, выберите Simulator -> Hardware -> Erase all content and settings.
Вимукти Раджапакша

1
Для версии 11.5; iOS Simulator -> I / O -> Keyboard -> Connect Hardware Keyboard
miletliyusuf

40

Эмулятор пытается найти цифровую клавиатуру на Mac, но она не найдена (у MacBook Pro, MacBook Air и «нормальной / маленькой» клавиатуры ее нет). Вы можете отменить выбор параметра «Подключить аппаратную клавиатуру» или просто проигнорировать сообщение об ошибке, это не окажет негативного влияния на приложение.


16

Просто зайдите в

Симулятор iOS -> Оборудование -> Клавиатура -> Снимите флажок «Подключить аппаратную клавиатуру».

Это решит проблему.

Ваша клавиатура MAC не будет работать после выполнения вышеуказанного шага, вы должны использовать клавиатуру симулятора.


12

Я использую xcode с ios 8, просто снимите флажок с опции подключения аппаратной клавиатуры в вашем симуляторе-> Оборудование-> Клавиатура-> Подключить аппаратную клавиатуру.

Это решит проблему.


Буквально не знаю, где находится этот симулятор iOS. Или где железо? Вы говорите о реальном симуляторе, похожем на iPhone, и с его помощью я нахожу оборудование?
Thomas

7

У меня была такая же проблема в Xcode 8.1 и iOS 10.1. Что сработало для меня, так это переход в Simulator-> Hardware-> Keyboard и снятие флажка Connect Hardware Keyboard.


7

Перейдите в Simulator-> Hardware-> Keyboard и снимите флажок Connect Hardware Keyboard.

То же, что и многие ответы выше, НО не изменилось для меня, пока я не выйду и не перезапущу симулятор. xcode 8.2.1 и Simulator 10.0.


5

Запустите приложение с помощью симулятора

iOS Simulator-> Hardware-> Keyboard -> iOS использует ту же раскладку, что и OS X

Это решит проблему, если кто-нибудь запустит свое приложение на своем устройстве.


3

У меня такое же сообщение об ошибке по двум разным причинам, поэтому вы можете добавить их в свой контрольный список отладки:

Контекст: Xcode 6.4, iOS: 8.4. Я добавлял панель инструментов с настраиваемыми UIBarButtons для загрузки с помощью UIKeyboardTypeNumberPad(Swift:) UIKeyboardType.numberPad, а именно «Готово» и «+/-». У меня была эта проблема, когда:

  1. Мой UIToolbar был объявлен как свойство, но я забыл явно выделить / инициализировать его.

  2. Я остановился на последней строке, [myCustomToolbar sizeToFit];которая звучит так, как будто это та же семья, что и ответ Холдена (мой код здесь: https://stackoverflow.com/a/32016397/4898050 ).

Удачи


2

В вашем приложении iOS невозможно найти цифровую клавиатуру, подключенную к вашей OS X. Поэтому вам просто нужно снять флажок с опции подключения аппаратной клавиатуры в вашем симуляторе по следующему пути только для целей тестирования:

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

Это решит указанную выше проблему.

Я думаю, вы тоже должны увидеть ссылку ниже. Он говорит, что это bugв XCodeконце этой ветки форума!

Ссылка


1

У меня была такая же проблема с использованием профиля обеспечения распространения. Убедитесь, что вы используете профиль разработчика


1

Почему длинный код и не использовать UIToolbar? поскольку предупреждение все еще сохраняется?

UIToolbar работает для любой версии iOS, вот мой пример кода

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

Возможно, вам следует сбросить рамку кнопки, у меня тоже была проблема, и введите в журнал вид клавиатуры следующим образом:

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

Хорошо, вот простое исправление для отображения кнопки «Готово» и ее работы в приложении как в iOS 9, так и в iOS 8 и ниже, когда я получаю аналогичную ошибку. После запуска приложения и его просмотра с помощью «Иерархии представления» (т.е. щелчка по значку «Просмотр иерархии» на панели области отладки, когда приложение работает на устройстве и проверки ваших представлений в раскадровке) можно было наблюдать , что клавиатура отображается на разные окна в iOS 9 по сравнению с iOS 8 и более ранними версиями и должны быть учтены. 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;
    }
}

И вот как вы можете удалитьKeyboardButton с клавиатуры, если хотите.

- (void)removeKeyboardButton {

id windowTemp = [self addButtonToKeyboard];

if (windowTemp) {

    for (UIView *doneButton in [windowTemp subviews]) {
        if ([doneButton isKindOfClass:[UIButton class]]) {
            [doneButton setHidden:TRUE];
        }
    }
  }
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.