动态更改 UISearchBar 的键盘类型

Posted

技术标签:

【中文标题】动态更改 UISearchBar 的键盘类型【英文标题】:Dynamically Changing Keyboard Type for a UISearchBar 【发布时间】:2009-10-20 12:44:42 【问题描述】:

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

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

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

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

我知道在选择有问题的按钮时会触发正确的案例。但是屏幕键盘不会改变,除非我点击取消按钮隐藏键盘,然后再次点击搜索字段以再次调出键盘。

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

【问题讨论】:

【参考方案1】:

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

[searchBar reloadInputViews]

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

【讨论】:

仅供参考,[searchBar reloadInputViews] 在大多数地方都不起作用 Xcode 4.2 for iOS 5.0.1。使用的键盘类型是情节提要中指定的键盘类型,我只能在 (void)searchBar:(UISearchBar *)aSearchBar textDidChange:(NSString *)searchText 中更改键盘类型。我已经尝试在 VDL 中更改它,在 UIKeyboardDidShowNotification 之后,没有任何问题。 我发现了一个缺点:如果用户同时输入数字和字母,调用这个方法会自动切换到字母键盘,即使他想继续输入数字 这应该是公认的答案。辞职和设置第一响应者可能会产生意想不到的副作用。 不幸的是(2019 年)这对我不起作用 - 你似乎必须辞职/成为。是的,你必须小心你的文本输入处理代码。【参考方案2】:

尽管这是一种 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];


【讨论】:

谢谢。我认为这将是解决方案,但希望不那么“不干净”。 很有趣,如果你调用 resignFirstResponder 和 becomeFirstResponder 之后立即切换键盘而不关闭【参考方案3】:
[searchBar reloadInputViews] 

[searchBar resignFirstResponder];
[searchBar becomeFirstResponder];

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

【讨论】:

以上是关于动态更改 UISearchBar 的键盘类型的主要内容,如果未能解决你的问题,请参考以下文章

iPhone UISearchBar & keyboard外观

用户使用 UISearchBar 时更改 UIStatusBarStyle

将动态类型添加到 UISearchBar

UISearchBar 取消

UISearchBar-更改范围而不使表格变灰?

自定义键盘文本完全替换 UISearchBar 中的文本,而不是添加到其中 [iOS]