我正在尝试在我的某个页面中实现搜索栏。
由于其设计,我没有使用常规搜索栏。
我的拥有如下。
UIImageView above UIView (textfield background)
UITextField above UIImageView (textfield)
我正在delegates
使用UITextField
。
在代码中我searchTF.clearButtonMode = UITextFieldViewModeWhileEditing;
显示清除按钮。
搜索工作正常,但问题在于清除按钮的代理。
我有以下代码
- (BOOL)textFieldShouldClear:(UITextField *)textField
{
if (textField == searchTF) {
NSLog(@"clicked clear button");
[textField resignFirstResponder]; // this is not working
// also below is not working
// [searchTF resignFirstResponder];
}
return YES;
}
当我点击清除按钮时,我得到NSLog文本“点击清除按钮”,但键盘不会被解雇。
当我有
时,不知道为什么键盘不会被解雇即使我尝试使用[self.view endEditing:YES];
进行如下操作,但仍无效。
- (BOOL)textFieldShouldClear:(UITextField *)textField
{
if (textField == searchTF) {
[self.view endEditing:YES];
[self hideAllKeyboards];
}
return YES;
}
答案 0 :(得分:3)
除了我的评论,我做了一些测试,这是我的结果:
我刚刚使用所有委托方法实现了UITextField
:
- (BOOL)textFieldShouldClear:(UITextField *)textField {
NSLog(@"Should Clear");
[textField resignFirstResponder];
return YES;
}
- (void)textFieldDidBeginEditing:(UITextField *)textField {
NSLog(@"Begin editing");
}
- (void)textFieldDidEndEditing:(UITextField *)textField {
NSLog(@"End editing");
}
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField {
NSLog(@"Should begin editing");
return YES;
}
- (BOOL)textFieldShouldEndEditing:(UITextField *)textField {
NSLog(@"Should end editing");
return YES;
}
- (BOOL)textField:(UITextField *)textField
shouldChangeCharactersInRange:(NSRange)range
replacementString:(NSString *)string {
NSLog(@"Change char");
return YES;
}
只要您点击清除按钮,日志就会输出:
2014-07-26 11:08:44.558 Test[36330:60b] Should Clear
2014-07-26 11:08:44.558 Test[36330:60b] Should end editing
2014-07-26 11:08:44.559 Test[36330:60b] End editing
2014-07-26 11:08:44.560 Test[36330:60b] Should begin editing
2014-07-26 11:08:44.561 Test[36330:60b] Begin editing
正如您所看到的那样,shouldBeginEditing
和didBeginEditing
方法会在清除后被调用,因此resignFirstResponder
中的textFieldshouldClear
会在新becomeFirstResponder
之前被调用由shouldBeginEditing
或didBeginEditing
调用。
答案 1 :(得分:0)
我不确定问题是什么 ,但我解决了在使用NSTimer
一段时间后调用dismiss键盘方法。
以下是我的所作所为。
- (BOOL)textFieldShouldClear:(UITextField *)textField
{
if (textField == searchTF) {
[NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(hideAllKeyboards) userInfo:nil repeats:NO];
}
return YES;
}
-(void) hideAllKeyboards {
[searchTF resignFirstResponder];
}
这样,点击清除按钮后,键盘就会被解除。
如果有人发布回答为什么会发生这种情况会很棒。我会将答案标记为已接受。
根据丹尼尔的回答,我在下面做了。
- (BOOL)textFieldShouldClear:(UITextField *)textField
{
if (textField == searchTF) {
isFilterOn.text = @"no";
[textField resignFirstResponder];
textField.text = @"";
[self myTextFieldDidChange];
}
return NO;
}
在myTextFieldDidChange
中,我根据UITextField
中的文字显示已过滤的列表和未过滤的列表。
答案 2 :(得分:0)
我相信您的文本字段IBOutlet已正确连接,尽管您可以尝试
[[[UIApplication sharedApplication] keyWindow] endEditing:YES];