Неможливо знайти клавіатуру, яка підтримує тип 4 для клавіатури iPhone-Portrait-NumberPad клавіатури; використовуючи 3876877096_Por 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_Por Portrait_iPhone-Simple-Pad_Default

тоді ця спеціальна кнопка також не відображається, що я думаю, що через ці 2 рядки:

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

і

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

Будь-які пропозиції?

Відповіді:


10

У мене також була ця проблема і знайшов рішення.

Нижче наведено код, який буде працювати для iOS 8.0, а також для нижчих версій.

Я перевірив його на iOS 7 та 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;
    }
}

Сподіваюся, це допомагає.

Але я все одно отримую це попередження:

Неможливо знайти клавіатуру, яка підтримує тип 4 для клавіатури iPhone-Portrait-NumberPad клавіатури; використовуючи 3876877096_Por Portrait_iPhone-Simple-Pad_Default

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


Для мене чудово працювали. Дякую, друже.
CRAZYSNAKE

Для addDoneButton або removeDoneButton: stackoverflow.com/questions/26031798 / ... я біжу вище код в XCode-5.1.1 в пристроях КСН-6/7/8. Працює ідеально.
alishaik786

1
- (недійсний) doneButton: (UIButton *) відправник {NSLog (@ "fdsfdsdsf"); }
SampathKumar

Я робив усі ці дії, але зроблену кнопку не можна натискати, чи можете ви мене гепл?
SergStav

З останньою версією iOS 8.3 і вище щось змінилося, що не відповідає попередньому опублікованому коду. Я додав чек на iOS 8.3 і вище, він може перестати працювати для майбутньої версії iOS. Перевірте вище.
iGW

143

У мене теж була ця проблема після оновлення до останньої бета-версії Xcode. Налаштування на тренажері оновлені, тому було виявлено (зовнішню) клавіатуру ноутбука. Якщо ви просто натисніть:

iOS Simulator -> Обладнання -> Клавіатура -> Підключення апаратної клавіатури

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


14
Я, мабуть, помилково потрапив на Shift + Cmd + K!
Ерік

1
iOS Simulator -> Обладнання -> Клавіатура -> Підключіть апаратну клавіатуру, зніміть її, і це вирішено
EFE

Це лише пропускає чек, який видає помилку, коли ви знаходитесь на тренажері - помилки та помилки клавіатури все одно відбуватимуться в реальному світі на реальних пристроях.
Зак

Якщо це не працює, виберіть Симулятор -> Обладнання -> Стерти весь вміст та налаштування.
Вімукті Раджапакша

1
Для версії 11.5; iOS Simulator -> I / O -> Клавіатура -> Підключення апаратної клавіатури
miletliyusuf

40

Емулятор намагається знайти цифрову клавіатуру на mac, але цього не знайдено (у MacBook Pro, MacBook Air та "нормальної / маленької" клавіатури її немає). Ви можете скасувати вибір опції Connect Hardware Keyboard або просто проігнорувати повідомлення про помилку, це не матиме негативного впливу на додаток.


16

Просто перейдіть до

iOS Simulator -> Обладнання -> Клавіатура -> Зніміть прапорець підключити опцію Підключення апаратної клавіатури.

Це виправить проблему.

Ваша MAC-клавіатура не працюватиме після виконання вищевказаного кроку. Вам потрібно використовувати клавіатуру симулятора.


12

Я використовую xcode з ios 8, просто зніміть прапорець підключити клавіатуру підключення програмного забезпечення у вашому Simulator-> Hardware-> Keyboard-> Connect Hardware Keyboard.

Це вирішить питання.


Буквально поняття не має, де цей симулятор iOS. Або де апаратне обладнання? Ви говорите про власний симулятор, як про річ, схожу на iPhone, і через це я знаходжу обладнання?
Томас

7

У мене була однакова проблема в Xcode 8.1 та iOS 10.1. Те, що для мене працювало, переходило на Simulator-> Hardware-> Keyboard та знімав прапорець Connect Hardware Keyboard.


7

Перейдіть у Simulator-> Hardware-> Keyboard та зніміть прапорець Connect the Hardware Keyboard.

Те саме, що багато відповідей вище, АЛЕ не змінилося для мене, поки я не вийшов із системи та не перезапустив тренажер. xcode 8.2.1 та Simulator 10.0.


5

Запустіть додаток за допомогою тренажера

iOS Simulator-> Обладнання-> Клавіатура -> iOS використовує такий же макет, що і OS X

Це вирішить проблему, якщо хтось там працює на своєму пристрої


3

Я отримав одне і те ж повідомлення про помилку з двох окремих причин, тож ви можете додати їх у свій контрольний список налагодження:

Контекст: Xcode 6.4, iOS: 8.4. Я додавав панель інструментів із спеціальними UIBarButtons для завантаження з UIKeyboardTypeNumberPad(Swift:) UIKeyboardType.numberPad, а саме "Готово" та "+/-". У мене була ця проблема, коли:

  1. Мій панель UITool був задекларований як власність, але я забув чітко його виділити / відкрити.

  2. Я залишив останній рядок, [myCustomToolbar sizeToFit];який здається, що це та сама сім'я, що і відповідь Холдена (мій код тут: https://stackoverflow.com/a/32016397/4898050 ).

Удачі


2

У вашому додатку для iOS не можна знайти цифрову клавіатуру, приєднану до вашої ОС X. Тож вам просто потрібно зняти прапорець підключити опцію «Апаратна клавіатура» у вашому симуляторі за наступним шляхом лише для тестування:

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

Це вирішить вищезазначене питання.

Я думаю, ви також повинні побачити нижче посилання. Це говорить про те, що це bugв XCodeкінці цієї теми форуму!

Довідково


1

У мене була така ж проблема з використанням профілю забезпечення розподілу. Переконайтеся, що ви використовуєте профіль розробника


1

Чому довгий код і не використовувати панель UITool? оскільки попередження все ще зберігається?

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>>"

до8:

"<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.