动态更改UISearchBar的键盘类型

时间:2009-10-20 12:44:42

标签: iphone cocoa-touch uisearchbar

我有一个使用UISearchBarUISearchDisplayController的iPhone应用。搜索栏有三个范围按钮。我希望键盘在选择特定范围按钮时成为数字键盘,但在选择任何其他范围按钮时成为默认键盘。

我已实施UISearchBarDelegate selectedScopeButtonIndexDidChange:selectedScope方法,如下所示:

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

我知道该方法被调用,并且当选择了相关按钮时会触发正确的案例。但是屏幕键盘不会改变,除非我点击取消按钮隐藏键盘,然后再次点击搜索字段再次调出键盘。

有没有办法让键盘在屏幕上自动更改,或以编程方式隐藏它然后重新显示它?

3 个答案:

答案 0 :(得分:24)

如果您使用的是iOS 3.2或更高版本,则可以致电:

[searchBar reloadInputViews]

并立即切换,没有hackery。至少这对我在UITextField上有用。 (我提到这个是因为辞职/成为第一响应者技巧对我来说并不完全正常,但reloadInputViews确实如此。)

答案 1 :(得分:23)

即使这是一种黑客行为,这对我有用:

- (void)searchBar:(UISearchBar *)searchBar selectedScopeButtonIndexDidChange:(NSInteger)selectedScope {


    switch (selectedScope) {
    case 0:
       searchBar.keyboardType = UIKeyboardTypeNumberPad;
        break;
   default:
        searchBar.keyboardType = UIKeyboardTypeDefault;
        break;


    // Hack: force ui to reflect changed keyboard type
    [searchBar resignFirstResponder];
    [searchBar becomeFirstResponder];

}

答案 2 :(得分:1)

[searchBar reloadInputViews] 

[searchBar resignFirstResponder];
[searchBar becomeFirstResponder];

两者都可以工作,但第二种方法有更多的副作用,更改firstResponder,可以触发键盘的通知,因此可能会影响依赖于键盘通知的其他逻辑,并影响视图的框架,这取决于键盘框架的变化