İPhone-Portrait-NumberPad klavyesi için type 4'ü destekleyen anahtar düzlemi bulunamıyor; 3876877096_Portrait_iPhone-Simple-Pad_Default kullanarak


114

İPhone ve SDK için iOS 8 Gold Master'ı indirdim.

Uygulamayı test ettim ve bir şey dışında iyi çalışıyor.

Kullanıcı bir şeyler yazmak isterse sayısal tuş takımının görüneceği bir metin alanım var, ayrıca klavye göründüğünde boş alana özel bir düğme ekleniyor.

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

}

Bu şimdiye kadar iyi çalışıyordu.

Öncelikle şu uyarıyı alıyorum:

İPhone-Portrait-NumberPad klavyesi için type 4'ü destekleyen anahtar düzlemi bulunamıyor; 3876877096_Portrait_iPhone-Simple-Pad_Default kullanarak

o zaman bu özel düğme de gösterilmiyor, bence bu 2 satır:

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

ve

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

Baska öneri?

Yanıtlar:


10

Ben de bu sorunu yaşadım ve çözümü buldum.

Aşağıda iOS 8.0 ve ayrıca aşağıdaki sürümler için çalışacak kod bulunmaktadır.

İOS 7 ve 8.0'da test ettim (Xcode Sürüm 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;
    }
}

Bu yardımcı olur umarım.

Ama yine de şu uyarıyı alıyorum:

İPhone-Portrait-NumberPad klavyesi için type 4'ü destekleyen anahtar düzlemi bulunamıyor; 3876877096_Portrait_iPhone-Simple-Pad_Default kullanarak

Bu uyarıyı göz ardı ederek, onu çalıştırdım. Lütfen, bu uyarıdan kurtulup kurtulamayacağınızı bana bildirin.


Benim için harika çalıştı. Teşekkürler dostum.
CRAZYSNAKE

AddDoneButton veya removeDoneButton için: stackoverflow.com/questions/26031798/… Yukarıdaki kodu iOS-6/7/8 cihazlarında XCode- 5.1.1'de çalıştırıyorum. Mükemmel çalışıyor.
alishaik786

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

Bütün bu işlemleri yaptım ama yapılan buton tıklanabilir değil, bana hepl olur musun?
SergStav

İOS 8.3 ve sonraki sürümlerin en son sürümüyle, önceki kodda başarısız olan bir şey değişti. İOS 8.3 ve üzeri için kontrol ekledim, gelecekteki iOS sürümü için çalışmayı durdurabilir. Lütfen yukarıyı kontrol edin.
iGW

143

En son Xcode Beta'ya güncelledikten sonra ben de bu sorunu yaşadım. Simülatördeki ayarlar yenilendi, bu nedenle dizüstü bilgisayar (harici) klavye algılandı. Sadece şu tuşa basarsanız:

iOS Simülatörü -> Donanım -> Klavye -> Donanım Klavyesini Bağlayın

böylece girişin işaretlenmemiş olması için yazılım klavyesi bir kez daha görüntülenecektir.


14
Muhtemelen yanlışlıkla Shift + Cmd + K'ye basmışımdır!
Eric

1
iOS Simülatörü -> Donanım -> Klavye -> Donanım Klavyesini Bağla işaretini kaldırın ve çözüldü
EFE

Bu, yalnızca bir simülatör üzerindeyken hatayı atan kontrolü atlar - hata ve klavye değişimi, gerçek cihazlarda gerçek dünyada yine de gerçekleşecektir.
Zack

Bu işe yaramazsa, Simülatör -> Donanım -> Tüm içeriği ve ayarları sil'i seçin.
Wimukthi Rajapaksha

1
Sürüm 11.5 için; iOS Simülatörü -> I / O -> Klavye -> Donanım Klavyesini Bağlayın
miletliyusuf

40

Emülatör, mac üzerinde sayısal bir tuş takımı bulmaya çalışır, ancak bu bulunmaz (MacBook Pro, MacBook Air ve "normal / küçük" klavyede yoktur). Donanım Klavyesini Bağla seçeneğinin seçimini kaldırabilir veya hata mesajını yok sayabilirsiniz, uygulama üzerinde olumsuz bir etkisi olmayacaktır.


16

Sadece git

iOS Simulator -> Donanım -> Klavye -> Donanım Klavyesini Bağla Seçeneğinin işaretini kaldırın.

Bu sorunu çözecektir.

Yukarıdaki adımı gerçekleştirdikten sonra MAC klavyeniz çalışmayacaktır, simülatör klavyeyi kullanmanız gerekmektedir.


12

İos 8 ile xcode kullanıyorum sadece Simülatör -> Donanım -> Klavye -> Donanım Klavyesini Bağla bölümündeki harware klavye bağlan seçeneğinin işaretini kaldırın.

Bu sorunu çözecektir.


Bu iOS simülatörünün nerede olduğu hakkında hiçbir fikrim yok. Veya donanım nerede? Bir iPhone gibi görünen gerçek simülatörden bahsediyorsunuz ve bu sayede donanım mı buluyorum?
Thomas

7

Xcode 8.1 ve iOS 10.1'de de aynı sorunu yaşadım. Benim için işe yarayan şey Simülatör-> Donanım-> Klavye'ye gidip Donanım Klavyesine Bağlan'ın işaretini kaldırmaktı.


7

Simulator-> Hardware-> Keyboard'a gidin ve Connect Hardware Keyboard'un işaretini kaldırın.

Yukarıdaki birçok cevapla aynı ANCAK simülatörden çıkıp yeniden başlatana kadar benim için değişmedi. xcode 8.2.1 ve Simulator 10.0.


5

Simülatörü kullanarak uygulamayı çalıştırın

iOS Simulator-> Donanım-> Klavye -> iOS, OS X ile aynı düzeni kullanıyor

Dışarıdaki herhangi biri kendi cihazında uygulamasını çalıştırıyorsa bu sorunu çözecektir.


3

Aynı hata mesajını iki ayrı nedenden dolayı aldım, böylece bunları hata ayıklama kontrol listenize ekleyebilirsiniz:

Bağlam: Xcode 6.4, iOS: 8.4. (Swift :) UIBarButtonile yüklenecek özel e-postaları içeren bir araç çubuğu ekliyordum , yani "Bitti" ve "+/-". Bu sorunu ne zaman yaşadım:UIKeyboardTypeNumberPadUIKeyboardType.numberPad

  1. UIToolbar'ım bir özellik olarak ilan edildi, ancak onu açıkça tahsis etmeyi / başlatmayı unutmuştum.

  2. Son satırı bırakmıştım [myCustomToolbar sizeToFit];, ki bu Holden'ın cevabıyla aynı aileden geliyor gibi görünüyor (benim kodum: https://stackoverflow.com/a/32016397/4898050 ).

İyi şanslar


2

İOS Uygulamanızda, OS X'inize eklenmiş bir Sayısal Tuş Takımı bulamıyorsunuz. Bu nedenle, Simülatörünüzdeki Donanım Klavyesine bağlan seçeneğinin işaretini kaldırmanız yeterlidir, aşağıdaki yolda, yalnızca test amacıyla:

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

Bu, yukarıdaki sorunu çözecektir.

Bence aşağıdaki bağlantıyı da görmelisiniz. Bu bir olduğunu söylüyor bugiçinde XCodeolduğunu Forum sonrası iş parçacığı sonunda!

Referans


1

Dağıtım ön hazırlık profilini kullanırken aynı sorunu yaşadım. Geliştirici profilini kullanıp kullanmadığınızı kontrol edin


1

Neden uzun kod ve UIToolbar'ı kullanmıyorsunuz? uyarı hala devam ettiği için?

UIToolbar herhangi bir iOS Sürümü için çalışıyor işte örnek kodum

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

Belki de düğmenin çerçevesini sıfırlamalısınız, benim de bir sorun yaşadım ve klavyenin görünümünü şu şekilde loglayın:

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

Tamam, benzer bir hata aldığımda hem iOS 9, iOS 8 hem de daha düşük bir uygulamada bir uygulamada göstermek ve çalışmak için 'tamam' düğmesini almak için basit bir düzeltme. Bir uygulamayı çalıştırdıktan ve 'Görünüm Hiyerarşisi' aracılığıyla görüntüledikten sonra (yani uygulama cihazda çalışırken ve Storyboard'daki görünümlerinizi incelerken Hata Ayıklama Alanı çubuğundaki 'Hiyerarşiyi Görüntüle' simgesine tıkladığınızda) gözlemlenebilir , klavyenin üzerinde iOS 9'da, iOS 8 ve altı sürümlere kıyasla farklı pencereler ve hesaba katılması gerekir. 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;
    }
}

İsterseniz KeyboardButton'ı klavyeden bu şekilde kaldırabilirsiniz .

- (void)removeKeyboardButton {

id windowTemp = [self addButtonToKeyboard];

if (windowTemp) {

    for (UIView *doneButton in [windowTemp subviews]) {
        if ([doneButton isKindOfClass:[UIButton class]]) {
            [doneButton setHidden:TRUE];
        }
    }
  }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.