Jus*_*zic 18 iphone uitextfield uisearchbar
我正在使用UISearchBar(但不是通常联合使用的SearchDisplayController),当你点击'X'按钮时我想解除键盘.
我遵循了TomSwift的建议,当'X'被敲击并且效果很好时被叫.但是,从文本字段中退出第一个响应者并在UISearchBar实例中调用它们resignFirstResponder
都不会使键盘消失.
当用户轻敲X按钮时,有没有办法摆脱键盘?
这是我为了获得'清除'通知而做的事情:
- (void)viewDidLoad:
{
for (UIView* v in searchBar.subviews)
{
if ( [v isKindOfClass: [UITextField class]] )
{
UITextField *tf = (UITextField *)v;
tf.delegate = self;
break;
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后我有我的类设置来实现UISearchBarDelegate和UITextFieldDelegate.
将该类作为文本字段委托允许我接听此调用:
- (BOOL)textFieldShouldClear:(UITextField *)textField
{
[textField resignFirstResponder];
[self.searchBar resignFirstResponder];
return YES;
}
Run Code Online (Sandbox Code Playgroud)
我已经尝试了所有我能想到的东西.我正在尝试的最后一件事是找到一种方法来发出UISearchDelegate将在我的Controller类上调用的'searchBarCancelButtonClicked',但不是我确定我怎么能这样做,因为UISearchBar似乎没有任何直接方法使用此名称调用.
rad*_*iel 71
汤姆斯回答让我思考.如果用户点击清除按钮时搜索栏还不是第一个响应者,我们可以等到它,然后让它resignFirstResponder; 即沿着以下方向:
- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
{
[self performFilteringBySearchText: searchText]; // or whatever
// The user clicked the [X] button or otherwise cleared the text.
if([searchText length] == 0) {
[searchBar performSelector: @selector(resignFirstResponder)
withObject: nil
afterDelay: 0.1];
}
}
Run Code Online (Sandbox Code Playgroud)
像汤姆的恕我直言一样,工作就像一个魅力,而不是hacky.
这有效:
[searchBar performSelector:@selector(resignFirstResponder) withObject:nil afterDelay:0.1];
Run Code Online (Sandbox Code Playgroud)
已为SWIFT 3更新:
假设用户在搜索字段中输入了一个字符串,然后单击x,则当按下x时,以下代码可隐藏键盘
`
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String)
{
if searchBar.text == nil || searchBar.text == ""
{
searchBar.perform(#selector(self.resignFirstResponder), with: nil, afterDelay: 0.1)
}
}
Run Code Online (Sandbox Code Playgroud)
`
更新:
好吧,这完全是一个黑客,但我能够让它发挥作用。基本上,代码调用取消按钮的处理程序。为了使其工作,我必须延迟调用选择器,我不确定为什么会这样。另外,我必须为取消按钮编写一个访问器,就像您为文本字段所做的那样。
再说一次,这完全是一个黑客行为。我不确定我是否会自己在应用程序中执行此操作。
// this in the context of the search bar
- (UIButton*) cancelButton
{
for (UIView* v in self.subviews)
{
if ( [v isKindOfClass: [UIButton class]] )
return (UIButton*)v;
}
return nil;
}
// this is the textField delegate callback
- (BOOL)textFieldShouldClear:(UITextField *)textField
{
[textField resignFirstResponder];
UIButton* cb = _searchBar.cancelButton;
NSObject* target = [[cb allTargets] anyObject];
NSArray* actions = [cb actionsForTarget: target forControlEvent:UIControlEventTouchUpInside];
NSString* selectorName = [actions objectAtIndex:0];
SEL selector = NSSelectorFromString( selectorName );
[target performSelector: selector withObject: cb afterDelay: 0.1];
return YES;
}
Run Code Online (Sandbox Code Playgroud)
原答案:
如何首先显示清晰的“X”按钮?在我的测试用例中,我没有看到它显示......
尝试在 searchBar 而不是 textField 上执行 resignFirstResponder 。
归档时间: |
|
查看次数: |
36270 次 |
最近记录: |