我在视图中有四个textFields。 前三个是使用标准键盘编辑的。 最后一个是使用一个picker编辑的,它是textField的inputView属性。 这很酷,因为它可以上下滑动。
想象一下,我正在使用标准键盘在前三个textFields中的一个中键入内容。 现在我点击第四行。 我希望标准键盘缩回,拾取器向上滑动。 现在它只是瞬间交换。
我已经尝试使用textField委托方法在标准键盘上为resignFirstResponder编写逻辑,并使用选择器成为第一个响应者,但它仍然会立即更改。这是代码。
- (void)textFieldDidBeginEditing:(UITextField *)textField{
//If we go from a keyboard field to a picker field
if ((self.textFieldBeingEdited == self.nameField || self.locationField || self.controllerSNField)){
if (textField == equipTypeField) {
//Put away the keyboard
[self.textFieldBeingEdited resignFirstResponder];
//Show the Picker
[textField becomeFirstResponder];
}
}
}
如果我从第四个视图转到其他任何一个视图,我还需要编写逻辑来向下滑动拾取器并向上滑动键盘。但是,如果我能得到上半部分,那么第二部分应该是显而易见的。
任何想法如何在不进入动画块的情况下做到这一点?也许有通知?
感谢。
答案 0 :(得分:1)
问题可能是您在调用方法时已经开始编辑,因此对resignFirstResponder
的调用不执行任何操作,因为它不再是第一个响应者。也许如果你让它再次成为第一个响应者,它可能会起作用。但是,然后在becomeFirstResponder
上调用equipTypeField
可能会导致textFieldDidBeginEditing
再次被调用,导致您陷入无限循环。毫无疑问,这是一个庸医。但至少,我会尝试这个:
//So that the keyboard that animates out is the one that was previously showing
[self.textFieldBeingEdited becomeFirstResponder];
//Animate the keyboard out
[self.textFieldBeingEdited resignFirstResponder];
//Don't let the user screw anything up
[[UIApplication sharedApplication] beginIgnoringInteractionEvents];
//Animate the new keyboard in a little while later
[textField performSelector:@selector(becomeFirstResponder) withObject:nil afterDelay:0.25];
//Let the user interact with the application again after the animation completes
[[UIApplication sharedApplication] performSelector:@selector(endIgnoringInteractionEvents) withObject:nil afterDelay:0.25];
这仍然留下了放置此代码的位置的问题,因为如果将其放在textFieldDidBeginEditing
中,则可能会出现无限循环。我的建议是尝试一下,看看会发生什么。如果它工作,那么很好,否则,放入某种布尔标志或某些东西,以确保在调用didFinishEditing之前只调用一次。