15

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

我已经实现了UISearchBarDelegate selectedScopeButtonIndexDidChange:selectedScope如下方法:

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

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

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

4

3 回答 3

28

如果您使用的是 iOS 3.2 或更新版本,您可以调用:

[searchBar reloadInputViews]

它会立即切换而无需黑客攻击。至少这在 UITextField 上对我有用。(我提到这一点是因为辞职/成为第一响应者的技巧对我来说并不完全正确,但 reloadInputViews 确实如此。)

于 2012-03-19T17:20:49.080 回答
23

尽管这是一种 hack,但这对我有用:

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

}
于 2009-10-25T23:29:07.120 回答
1
[searchBar reloadInputViews] 

[searchBar resignFirstResponder];
[searchBar becomeFirstResponder];

两者都可以,但是第二种方法副作用更大,改变firstResponder,可以触发键盘的通知,所以可能会影响其他依赖于键盘通知的逻辑,并影响依赖于键盘框架变化的视图框架

于 2012-05-22T04:23:45.637 回答