已经是第二天了,还是想不出问题,
我有UITabelView
与自定义UICellViews
,每个自定义UICellView
由UILabel
和UITextField
组成。
自定义UICellView
对象在其init
方法中分配UITextField
和UILabel
,并在dealloc
中释放。
UITableView
中自定义UICellViews
的个数为6。
用户场景如下
- 当用户从1到5点击时,
UITextFields
虚拟键盘打开,用户输入一些文本 - 当用户点击第6个
UITextField
时,如果虚拟键盘处于活动状态,则虚拟键盘应隐藏,如果虚拟键盘处于隐藏状态则不显示。
在我的UIViewController
类中实现UITextFieldDelegate
协议,并设置每个UITextField
的委托为self。
我的委托方法如下
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{
if (textField.tag != 6) {
return YES;
} else {
[textField resignFirstResponder];
return NO;
}
}
-(BOOL) textFieldShouldEndEditing:(UITextField *)textField {
[textField resignFirstResponder];
return YES;
}
-(void) textFieldDidBeginEditing:(UITextField *)textField {
/* Some code */
}
-(void) textFieldDidEndEditing:(UITextField *)textField
{
[textField resignFirstResponder];
}
所有的功能都是正确的!
现在,虚拟键盘永远不会被隐藏,为什么会这样呢?
p。类似的代码可以在iPhone上运行,但是这个问题在iPad上仍然存在。
您需要知道最后使用的是哪个文本字段!输入[lastUsedTextField resignFirstResponder]
有一个肮脏但有效的技巧…你可以让你的文本字段成为新的活动UITextField,并在下一个循环中立即调用resignFirstResponder:
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{
if (textField.tag != 6) {
return YES;
} else {
// this will schedule keyboard dismissal for the current text field
dispatch_async(dispatch_get_main_queue(), ^{
[textField resignFirstResponder];
});
return YES; // -> make this one active
}
}
是否为textField设置了action ?
[YourTextField addTarget:self action:@selector(textFieldDoneEditing:) forControlEvents:UIControlEventEditingDidEndOnExit];