Man*_*uel 5 objective-c uitextfield ios
我正在为我的应用程序创建一个登录屏幕,当有一个尚未填写的字段时,我希望返回按钮说"下一步",并且当所有字段都填满时它会说"开始"(我正在谈论UITextFields).
下面的代码工作得很好,因为它在正确的时刻显示了Next和Go.但是每当它从"下一步"变为"开始"时,键盘上的下一个点击都会被忽略.当它说"Go"并且我通过退格来清空文本字段时,就没有这样的问题,并且它显示了Next.它几乎就像旧的键盘仍然存在,并在被点击后消失.
我的问题是:这个问题的根源是什么,更重要的是我如何摆脱键盘的冻结?
UITextField *theSender = (UITextField *)sender;
if (allTextFieldsAreFilled) {
if (theSender.returnKeyType!=UIReturnKeyGo) {
theSender.returnKeyType = UIReturnKeyGo;
[theSender resignFirstResponder];
[theSender becomeFirstResponder];
}
} else {
if (theSender.returnKeyType!=UIReturnKeyNext) {
theSender.returnKeyType = UIReturnKeyNext;
[theSender resignFirstResponder];
[theSender becomeFirstResponder];
}
}
Run Code Online (Sandbox Code Playgroud)
每次更改三个UITextField之一时,都会调用此代码,因此它是一个连接到Editing Changed事件的IBAction.
在此先感谢您的帮助!
编辑
我发现只有在textfield设置为secure(密码)时才会出现这种情况.当它没有设置为安全时,它不会冻结,我的代码完美运行!问题是当"安全"文本字段是第一响应者时,通常会发生对"开始"按钮的更改.所以这并没有改变任何问题.
我创建了一个新的单视图应用程序项目来测试这一点;并将以下代码放入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
Run Code Online (Sandbox Code Playgroud)
然后在 XIB 中创建三个UITextFields并将它们连接到IBOutlets、IBActions,并将此视图控制器设置为delegate所有字段的 。
无论安全字段如何,一切似乎都工作正常。
我的猜测是,您的问题出在代码中移动到“下一步”字段的位置;而不是您发布的代码中。还要确保您的所有销售点和代表都正确连接。
更新:我已经编辑了上面的代码。注释掉的行是问题所在,您应该使用它reloadInputViews来更新按钮。
看起来它没有锁定键盘;但它所做的是在您输入第一个字母并执行辞职/成为刷新按钮的调用之后,第二次按下将覆盖第一个字母。这似乎是 iOS 中的一个错误...如果在第一个字母后键入空格,则更明显。当我注意到我添加了一个标签,用密码字段的内容更新了它的内容时,就更清楚发生了什么。