2012-03-06 3 views
8

Я новичок в Objective-C, и я хочу ограничить переход пользователя из части алфавита обычной клавиатуры на цифровую/пунктуационную сторону. Говоря это, я хотел бы отключить кнопку на клавиатуре, которая делает переключатель. Возможно, я задаю неправильные параметры поиска, но я мало нахожу в Google и даже меньше в своих справочниках. Как я могу фактически отключить кнопку на клавиатуре iOS? С символами alpha/numeric/punctuation это легко сделать, просто игнорируя введенные символы, которые были введены, но кнопка, которая переключается между частями клавиатуры, выполняет действие, а не возвращает символ.Отключение клавиш на клавиатуре

Благодарим за помощь!

ответ

4

Вы на самом деле можете добавлять и удалять кнопки по умолчанию UIKeyboard

Там же некоторые рецепты в Интернете, как это: http://www.iphonedevsdk.com/forum/iphone-sdk-development/6573-howto-customize-uikeyboard.html и так: http://www.iphonedevsdk.com/forum/iphone-sdk-development/6275-add-toolbar-top-keyboard.html

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

Ниже я покажу вам подборку одного из решений:

//The UIWindow that contains the keyboard view - 
//It some situations it will be better to actually 
//iterate through each window to figure out where the keyboard is, 
// but In my applications case 
//I know that the second window has the keyboard so I just reference it directly 
// 
UIWindow* tempWindow = [[[UIApplication sharedApplication] windows] 
//      objectAtIndex:1]; 

//Because we cant get access to the UIKeyboard throught the SDK we will 
// just use UIView. 
//UIKeyboard is a subclass of UIView anyways 
UIView* keyboard; 

//Iterate though each view inside of the selected Window 
for(int i = 0; i < [tempWindow.subviews count]; i++) 
{ 
    //Get a reference of the current view 
    keyboard = [tempWindow.subviews objectAtIndex:i]; 

    //Check to see if the className of the view we have 
    //referenced is "UIKeyboard" if so then we found 
    //the keyboard view that we were looking for 
    if([[keyboard description] hasPrefix:@"<UIKeyboard"] == YES) 
    { 
     // Keyboard is now a UIView reference to the 
     // UIKeyboard we want. From here we can add a subview 
     // to th keyboard like a new button 

     //Do what ever you want to do to your keyboard here... 
    } 
} 
+0

Спасибо! Мне нужно взглянуть на это. Исходя из фона Java и C/C++, иногда, как Objective-C, все кажется немного, ну, странно. – alownx

1

Я реализовал аккуратнее решение. Хитрость заключается в том, чтобы поместить отключенное ключевое изображение поверх клавиатуры.

Для этого

  1. Выполнить эмулятора (в масштабе 100%) и экрана захватить актив вы хотите (в моем случае, это было отключено кнопку Готово в нижней правой части)
  2. Поместите это изображение на верхней части клавиатуры

Заметим, что клавиатура находится в отдельном UIWindow (с iOS5 я верю) и, таким образом, что вам нужно будет сделать следующее

+ (void) addSubviewToTop:(UIView *)view { 
    int count = [[[UIApplication sharedApplication] windows] count]; 
    if(count <= 0) { 
     warn(@"addSubviewToTop failed to access application windows"); 
    } 
    UIWindow *top_window = [[[UIApplication sharedApplication] windows] objectAtIndex:count-1]; 
    [top_window addSubview:view]; 
    [top_window bringSubviewToFront:view]; 
} 
0

Я не уверен, изменился ли SDK таким образом, что ответ @ppaulojr больше не работает, или если у меня есть вещи, которые были странными в моей системе, но со следующими настройками я смог заставить его работать!

Должности, связанные с ответом @ ppaulojr, отличные (http://www.iphonedevsdk.com/forum/iphone-sdk-development/6573-howto-customize-uikeyboard.html и http://www.iphonedevsdk.com/forum/iphone-sdk-development/6275-add-toolbar-top-keyboard.html), и они помогли мне заставить это работать.

По-видимому, фактический вид клавиатуры теперь встроен в подвыборку в некоторой более широкой структуре представления UIKeyboard, так что задействована небольшая рекурсия. Я получил эту работу:

-(void) findKeyboard { 

    NSArray* windows = [[UIApplication sharedApplication] windows]; 

    for (int i = 0; i < [windows count]; i++) { 

     UIWindow* tempWindow = [[[UIApplication sharedApplication] windows] 
                  objectAtIndex:i]; 

     for(UIView *subView in [tempWindow subviews]) 
     { 
      [self checkViews:subView]; 
     } 
    } 
} 

-(void)checkViews:(UIView *)inView 
{ 
    for(UIView *keyboard in inView.subviews) 
    { 
     NSLog(@"ViewName: %@", [keyboard description]); // Which view are we looking at 

     //Check to see if the className of the view we have 
     //referenced is "UIKeyboard" if so then we found 
     //the keyboard view that we were looking for 
     if([[keyboard description] hasPrefix:@"<UIKeyboard"] == YES) 
     { 
      // Keyboard is now a UIView reference to the 
      // UIKeyboard we want. From here we can add a subview 
      // to th keyboard like a new button 

      //Do what ever you want to do to your keyboard here... 


      break; 
     } 

     // Recurse if not found 
     [self checkViews:subView]; 
    }  
} 

Я также обнаружил, что лучшее место, чтобы вызвать эту функцию от -(void)textViewDidBeginEditing:(UITextView *)textView так:

- (void)textViewDidBeginEditing:(UITextView *)textView { 
    NSLog(@"textViewDidBeginEditing"); 

    [self findKeyboard]; 

} 

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

Смежные вопросы