Nie można znaleźć klawiatury obsługującej typ 4 dla klawiatury iPhone-Portrait-NumberPad; używając 3876877096_Portrait_iPhone-Simple-Pad_Default

114

Pobrałem iOS 8 Gold Master na iPhone'a i SDK.

Przetestowałem aplikację i działa dobrze, z wyjątkiem jednej rzeczy.

Mam pole tekstowe, w którym pojawi się klawiatura numeryczna, jeśli użytkownik chce coś wpisać, ponadto niestandardowy przycisk jest dodawany do pustego obszaru, gdy pojawia się klawiatura.

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

}

Do tej pory działało dobrze.

Przede wszystkim otrzymuję ostrzeżenie:

Nie można znaleźć klawiatury obsługującej typ 4 dla klawiatury iPhone-Portrait-NumberPad; używając 3876877096_Portrait_iPhone-Simple-Pad_Default

wtedy ten przycisk niestandardowy również się nie wyświetla, co myślę, że z powodu tych 2 linii:

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

i

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

Jakieś sugestie?

CRAZYSNAKE
źródło

Odpowiedzi:

10

Ja też miałem ten problem i znalazłem rozwiązanie.

Poniżej znajduje się kod, który będzie działał na iOS 8.0, a także na poniższych wersjach.

Przetestowałem to na iOS 7 i 8.0 (Xcode w wersji 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;
    }
}

Mam nadzieję że to pomoże.

Ale nadal otrzymuję to ostrzeżenie:

Nie można znaleźć klawiatury obsługującej typ 4 dla klawiatury iPhone-Portrait-NumberPad; używając 3876877096_Portrait_iPhone-Simple-Pad_Default

Ignorując to ostrzeżenie, działało. Proszę, daj mi znać, jeśli możesz uzyskać ulgę od tego ostrzeżenia.

iGW
źródło
U mnie zadziałało świetnie. Dzięki stary.
CRAZYSNAKE
Dla addDoneButton lub removeDoneButton: stackoverflow.com/questions/26031798/ ... Uruchomiłem powyższy kod w XCode-5.1.1 na urządzeniach iOS-6/7/8. Działa idealnie.
alishaik786,
1
- (void) doneButton: (UIButton *) nadawca {NSLog (@ "fdsfdsdsf"); }
SampathKumar
Wykonałem wszystkie te czynności, ale przycisk Gotowe nie jest klikalny, możesz mi pomóc?
SergStav
Wraz z najnowszą wersją iOS 8.3 i nowszych zmieniło się coś, co zawodzi poprzednio opublikowanego kodu. Dodałem czek dla iOS 8.3 i nowszych, może przestać działać dla przyszłej wersji iOS. Sprawdź powyżej.
iGW,
143

Ja też miałem ten problem po aktualizacji do najnowszej wersji Xcode Beta. Ustawienia w symulatorze zostały odświeżone, więc wykryto klawiaturę laptopa (zewnętrzną). Jeśli po prostu naciśniesz:

Symulator iOS -> Sprzęt -> Klawiatura -> Podłącz klawiaturę sprzętową

aby wpis był odznaczony, klawiatura oprogramowania zostanie ponownie wyświetlona.

aquagremlin
źródło
14
Prawdopodobnie przez pomyłkę wcisnąłem Shift + Cmd + K!
Eric
1
Symulator iOS -> Sprzęt -> Klawiatura -> Podłącz klawiaturę sprzętową, odznacz to i rozwiązane
EFE
To tylko pomija sprawdzenie, które generuje błąd, gdy jesteś na symulatorze - błąd i zamiana klawiatury będą nadal występować w prawdziwym świecie na prawdziwych urządzeniach.
Zack
Jeśli to nie zadziała, wybierz Symulator -> Sprzęt -> Wymaż całą zawartość i ustawienia.
Wimukthi Rajapaksha
1
Dla wersji 11.5; Symulator iOS -> I / O -> Klawiatura -> Podłącz klawiaturę sprzętową
miletliyusuf
40

Emulator próbuje znaleźć klawiaturę numeryczną na komputerze Mac, ale jej nie znaleziono (MacBook Pro, MacBook Air i klawiatura „normalna / mała” jej nie mają). Możesz odznaczyć opcję Podłącz klawiaturę sprzętową lub po prostu zignorować komunikat o błędzie, nie będzie to miało negatywnego wpływu na aplikację.

mroczny człowiek
źródło
16

Po prostu idź do

Symulator iOS -> Sprzęt -> Klawiatura -> Odznacz opcję Podłącz klawiaturę sprzętową.

To rozwiąże problem.

Twoja klawiatura MAC nie będzie działać po wykonaniu powyższego kroku, musisz użyć klawiatury symulatora.

Avinash651
źródło
12

Używam xcode z ios 8, po prostu odznacz opcję connect harware keyboard w twoim Simulator-> Hardware-> Keyboard-> Connect Hardware Keyboard.

To rozwiąże problem.

user4600710
źródło
Dosłownie nie mam pojęcia, gdzie jest ten symulator iOS. Albo gdzie jest sprzęt? Mówisz o prawdziwym symulatorze, podobnym do tego, który wygląda jak iPhone, i dzięki temu znajduję sprzęt?
Thomas
7

Miałem ten sam problem w Xcode 8.1 i iOS 10.1. To, co zadziałało, to przejście do Symulatora-> Sprzęt-> Klawiatura i odznaczenie opcji Połącz klawiaturę sprzętową.

Carlson
źródło
7

Wejdź w Symulator-> Sprzęt-> Klawiatura i odznacz Podłącz klawiaturę sprzętową.

Tak samo jak wiele odpowiedzi powyżej, ALE nie zmieniło się to dla mnie, dopóki nie wyjdę i ponownie uruchomię symulator. xcode 8.2.1 i Simulator 10.0.

tdw
źródło
5

Uruchom aplikację za pomocą symulatora

Symulator iOS-> Sprzęt-> Klawiatura -> iOS używa tego samego układu co OS X

To rozwiąże problem, jeśli ktoś uruchomi swoją aplikację na swoim urządzeniu

Ronaldoh1
źródło
3

Otrzymałem ten sam komunikat o błędzie z dwóch różnych powodów, więc możesz dodać je do listy kontrolnej debugowania:

Kontekst: Xcode 6.4, iOS: 8.4. Dodawałem pasek narzędzi z niestandardowymi UIBarButtons do załadowania za pomocą UIKeyboardTypeNumberPad(Swift:) UIKeyboardType.numberPad, a mianowicie „Gotowe” i „+/-”. Miałem ten problem gdy:

  1. Mój UIToolbar został zadeklarowany jako właściwość, ale zapomniałem jawnie go przydzielić / zainicjować.

  2. Opuściłem ostatnią linię, [myCustomToolbar sizeToFit];która brzmi, jakby była to ta sama rodzina, co odpowiedź Holdena (mój kod tutaj: https://stackoverflow.com/a/32016397/4898050 ).

Powodzenia

AmitaiB
źródło
2

W aplikacji na iOS nie można znaleźć klawiatury numerycznej podłączonej do systemu OS X. Wystarczy więc odznaczyć opcję podłączenia klawiatury sprzętowej w symulatorze, w następującej ścieżce tylko do celów testowych:

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

To rozwiąże powyższy problem.

Myślę, że powinieneś również zobaczyć poniższy link. Mówi, że to bugw XCodena koniec tego wątku Forum postu!

Odniesienie

Hitesh Surani
źródło
1

Miałem ten sam problem podczas korzystania z profilu informacyjnego dystrybucji. Sprawdź, czy korzystasz z profilu programisty

KIO
źródło
1

Dlaczego długi kod i nie używać UIToolbar? ponieważ ostrzeżenie jest nadal aktualne?

UIToolbar działa dla dowolnej wersji iOS, oto mój przykładowy kod

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
źródło
0

Może powinieneś zresetować ramkę przycisku, ja też miałem jakiś problem i nsloguj widok klawiatury tak:

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
źródło
-1

Okay, oto prosta poprawka, aby przycisk „gotowe” wyświetlał się i działał w aplikacji w systemie iOS 9, iOS 8 i starszym, gdy otrzymałem podobny błąd. Można to zaobserwować po uruchomieniu aplikacji i przejrzeniu jej za pośrednictwem `` Hierarchii widoku '' (tj. Kliknięcia ikony `` Wyświetl hierarchię '' na pasku Obszar debugowania, gdy aplikacja jest uruchomiona na urządzeniu i sprawdzeniu widoków w Storyboard), że klawiatura jest wyświetlana różne okna w iOS 9 w porównaniu z iOS 8 i niższymi wersjami i należy je uwzględnić. 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;
    }
}

I tak możesz usunąćKeyboardButton z klawiatury, jeśli chcesz.

- (void)removeKeyboardButton {

id windowTemp = [self addButtonToKeyboard];

if (windowTemp) {

    for (UIView *doneButton in [windowTemp subviews]) {
        if ([doneButton isKindOfClass:[UIButton class]]) {
            [doneButton setHidden:TRUE];
        }
    }
  }
}
Vick Swift
źródło