Iphone – Dynamically Changing Keyboard Type for a UISearchBar

cocoa-touchiphoneuisearchbar

I have an iPhone app that uses a UISearchBar and UISearchDisplayController. The search bar has three scope buttons. I would like the keyboard to be a numeric keypad when a particular scope button is selected, but be a default keyboard when any other scope button is selected.

I have implemented the UISearchBarDelegate selectedScopeButtonIndexDidChange:selectedScope method as follows:

- (void)searchBar:(UISearchBar *)searchBar selectedScopeButtonIndexDidChange:(NSInteger)selectedScope
{
    switch (selectedScope) {
        case DeviceIDScopeIndex:
            searchBar.keyboardType = UIKeyboardTypeNumberPad;
            break;
        default:
            searchBar.keyboardType = UIKeyboardTypeDefault;
            break;
    }
}

I know that the method gets called, and the right case gets triggered when the button in question is selected. But the onscreen keyboard doesn't change unless I tap the Cancel button to hide the keyboard, then tap the search field again to bring up the keyboard again.

Is there a way to get the keyboard to change itself while it's onscreen, or to programmatically hide it and then reshow it?

Best Answer

If you're using iOS 3.2 or newer, you can call:

[searchBar reloadInputViews]

and it switches immediately without hackery. At least this works for me on a UITextField. (I mention this because the resign/become first responder trick didn't work exactly right for me, but reloadInputViews did.)