已经是第二天了,还没弄清楚问题,
我有 UITabelView
和自定义 UICellViews
,每个自定义 UICellView
都由 UILabel
和 UITextField 组成
。
自定义 UICellView
对象在其 init
方法中分配 UITextField
和 UILabel
并在 dealloc 中释放
。
UITableView
中自定义UICellViews
个数为6个。
用户场景如下
- 当用户点击 1 到 5
UITextFields
时,虚拟键盘打开,用户输入一些文本 - 当用户点击第 6 个
UITextField
时,如果虚拟键盘处于事件状态,则应将其隐藏,如果隐藏则不显示。
在我的 UIViewController
类中实现 UITextFieldDelegate
协议(protocol),并将每个 UITextField
的委托(delegate)设置为自己。
我的委托(delegate)方法如下
- (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];
}
所有功能正常!
所以现在,虚拟键盘永远不会被隐藏,为什么会这样?
附言。类似代码在 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
}
}
关于iphone - resignFirstResponder 上的 UITextField 奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8396862/