【发布时间】:2016-03-10 10:30:02
【问题描述】:
我在 UIView 中有多个 UITextField。我在用户开始使用 textFieldShouldBeginEditing: 编辑字段之前更改视图布局,然后通过 textFieldDidEndEditing: 恢复它。
例如
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{
NSLog(@"%s", __FUNCTION__);
// Change UIView layout
return YES;
}
- (void)textFieldDidEndEditing:(UITextField *)textField
{
NSLog(@"%s", __FUNCTION__);
// Restore UIView layout
}
但是,如果我在编辑 UITextField 时单击另一个 UITextField,则执行顺序为:
- 另一个
UITextField的textFieldShouldBeginEditing:。 - 当前
UITextField的textFieldDidEndEditing:。
又名控制台日志:
textFieldShouldBeginEditing:
textFieldDidEndEditing:
在这种情况下,UIView 布局设置将不正确。我也试过textFieldShouldEndEditing:,但没有改变顺序。
如果我将 KVO 样式的观察者添加到 UIKeyboardWillShowNotification / UIKeyboardWillHideNotification,则顺序为:
textFieldShouldBeginEditing:
keyboardWillShow:
textFieldShouldBeginEditing:
textFieldDidEndEditing:
keyboardWillShow:
然后我可以在textFieldShouldBeginEditing: 中在keyboardWillShow: 中做需要做的事情。但由于我无法像textFieldShouldBeginEditing: 和textFieldDidEndEditing: 那样获得当前的UITextField,因此我将无法正确进行必要的更新。
我知道我可以设置另一个变量来跟踪当前的编辑状态,但是有没有更好的方法来确保一个 UITextField 在切换之前完成了编辑?
【问题讨论】:
-
你试过添加观察者吗?比如keyboardWillShow和KeyboardWillHide
-
第一响应者可能会帮助您获取当前文本字段?
-
@zcui93 我确实使用
isFirstResponder对两个文本字段进行了检查。似乎他们都不是当textFieldDidEndEditing:被调用时,所以不能做我想做的事。 -
在键盘通知方法中检查它们? textField 结束编辑后,他们不再是第一响应者。
-
我只是想知道,如果您在每个“开始编辑”中保存当前的第一响应者并在前一个上调用 resignFirstResponder(如果已设置)会怎样。这样,您可能会强制从“开始编辑”中立即调用“结束编辑”。
标签: ios objective-c iphone uitextfield uitextfielddelegate