Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can I programmatically fire the "switch to number pad" button on iPhone keyboard

I want to find a way to programmatically fire the selector that causes the iPhone keyboard to switch from letters to numbers. I am aware that I can switch the keyboard type, but I want to know if there is a way to do this without switching the keyboard type.

like image 716
rickharrison Avatar asked Feb 27 '10 21:02

rickharrison


3 Answers

You cannot switch keyplanes (alphabetic keyplane to numeric keyplane to symbol keyplane) programatically, at least not in any way that is publicly supported. As you mentioned, you can change the keyboard type or appearance of the text input traits of the first responder, but this is different than switching between the different keyplanes, which only the user should be able to do.

like image 193
orange Avatar answered Nov 16 '22 15:11

orange


Just a workaround: When you want to change the keyplane of an active keyboard like from alphabet to number pad while editing an UITextField, first set the new value to the keyboardType property of the textfield, next send a resignFirstResponder, finally a becomeFirstResponder message to the textfield. E.g.

textfield.keyboardType = UIKeyboardTypeNumberPad;
[textField resignFirstResponder];
[textField becomeFirstResponder];

Swift:

textField.keyboardType = .numberPad
textField.resignFirstResponder()
textField.becomeFirstResponder()

Hope it helps ;-D

like image 27
dejo Avatar answered Nov 16 '22 15:11

dejo


For custom switching keyboard types you can use accessoryView of Keyboard

enter image description here

enter image description here

Code to make the keyboard accessoryView for type switching... (hopefully the snipped code is understandable)

// You can call this in viewDidLoad (initialization of the ABC/Done view) 
- (void)setAccessoryViewForKeyboard{
    UIToolbar *toolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, self.bounds.size.width, 44)];
    UIBarButtonItem *changeKeyboard = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:self action:@selector(switchKeyboardTypes)];
    UIBarButtonItem *space = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
    UIBarButtonItem *choose = [[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@"Done", @"") style:UIBarButtonItemStylePlain target:_textField action:@selector(resignFirstResponder)];
    [toolbar setItems:@[changeKeyboard, space, choose]];
    [self.textField setInputAccessoryView:toolbar];

}

// changing the left button text ('ABC' and '123')
- (void)setTitleForSwitchingKeyboardButton{
    NSString *firstButtonText = self.textField.keyboardType == UIKeyboardTypeDefault ? NSLocalizedString(@"123", @"") : NSLocalizedString(@"ABC", @"");
    [[[(UIToolbar *)self.textField.inputAccessoryView items] firstObject] setTitle:firstButtonText];
}


- (void)switchKeyboardTypes{
    if (self.textField.keyboardType == UIKeyboardTypeDefault){
        [self setTextFieldKeyboardType:UIKeyboardTypeNumberPad];
    } else {
        [self setTextFieldKeyboardType:UIKeyboardTypeDefault];
    }
}

- (void)setTextFieldKeyboardType:UIKeyboardTypeNumberPad:(UIKeyboardType)keyboardType {

    [self.textField setKeyboardType:keyboardType];

    if ([_textField isFirstResponder]) {

        _changingKeyboardType = YES;
        [self.textField resignFirstResponder];
        [self.textField becomeFirstResponder];
        _changingKeyboardType = NO;
    }

    [self setTitleForSwitchingKeyboardButton];
}


-(BOOL)textFieldShouldBeginEditing:(UITextField *)textField {
    if (!_changingKeyboardType) {
        // you can set the default keyboard type here:
        // [self setTextFieldKeyboardType:UIKeyboardTypeNumberPad];
        // [self setTextFieldKeyboardType:UIKeyboardTypeDefault];
        [self setTitleForSwitchingKeyboardButton];
    }
 }
like image 2
Marek Manduch Avatar answered Nov 16 '22 15:11

Marek Manduch