我创建了一个新的Single View Application项目来测试它;并在ViewController.m
#import "ViewController.h"
@interface ViewController () <UITextFieldDelegate>
{
@private
IBOutlet UITextField* m_fieldA;
IBOutlet UITextField* m_fieldB;
IBOutlet UITextField* m_fieldC;
}
@end
@implementation ViewController
// connected to Editing Did Begin
- (IBAction) onFocus:(UITextField*)_textField
{
[self updateKeyboardFor:_textField];
}
// connected to Editing Changed
- (IBAction) onChanged:(UITextField*)_textField
{
[self updateKeyboardFor:_textField];
}
- (void) updateKeyboardFor:(UITextField*)_textField
{
bool allTextFieldsAreFilled = [m_fieldA.text length] && [m_fieldB.text length] && [m_fieldC.text length];
if (allTextFieldsAreFilled)
{
if (_textField.returnKeyType != UIReturnKeyGo)
{
_textField.returnKeyType = UIReturnKeyGo;
//[_textField resignFirstResponder];
//[_textField becomeFirstResponder];
[_textField reloadInputViews];
}
}
else
{
if (_textField.returnKeyType != UIReturnKeyNext)
{
_textField.returnKeyType = UIReturnKeyNext;
//[_textField resignFirstResponder];
//[_textField becomeFirstResponder];
[_textField reloadInputViews];
}
}
}
// A part of UITextFieldDelegate
- (BOOL) textFieldShouldReturn:(UITextField*)_textField
{
if (_textField.returnKeyType == UIReturnKeyGo)
{
[_textField resignFirstResponder];
// go off and perform 'go'
}
else
{
if(_textField == m_fieldA) [m_fieldB becomeFirstResponder];
if(_textField == m_fieldB) [m_fieldC becomeFirstResponder];
if(_textField == m_fieldC) [m_fieldA becomeFirstResponder];
}
return true;
}
@end
然后在 XIB 中创建三个UITextFields
并将它们连接到IBOutlets
, IBActions
,并将此视图控制器设置delegate
为所有字段。
无论安全领域如何,一切似乎都可以正常工作。
我的猜测是您的问题出在您移至“下一个”字段的代码中;而不是在您发布的代码中。还要确保您的所有网点和代表都正确连接。
更新:我已经编辑了上面的代码。注释掉的行是问题所在,您应该使用它reloadInputViews
来更新按钮。
似乎它没有锁定键盘;但它所做的是在您输入第一个字母并发出辞职/成为电话以刷新按钮之后,第二次按下将覆盖第一次。这似乎是 iOS 中的一个错误……如果在第一个字母后键入空格,则更明显。当我注意到我添加了一个标签,该标签使用密码字段的内容更新了它的内容时,发生了什么就更加清楚了。