UITextField secureEntry 不遵守 clearsOnBeginEditing 属性
UITextField secureEntry doesn't respect clearsOnBeginEditing property
我正在 iOS 上构建一个应用程序 8. 我有一个登录屏幕,用户可以在其中输入用户名和密码。当他们输入了有效的用户名和密码后,他们就可以进入下一个屏幕(启用一个按钮,允许他们前进)。
我编写了逻辑,告诉按钮何时启用或禁用自身,它基于 UITextFieldDelegate
方法:
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
此方法告诉我何时我的文本字段将更改其文本 - 非常简单。我已将密码文本字段的 secureTextEntry
属性 设置为 YES,将其 clearsOnBeginEditing
属性 设置为 NO。
当我离开密码文本框然后回到它(通过点击它里面)并输入一些东西时,文本仍然被擦除。让事情变得更加复杂的是,shouldChangeCharactersInRange:replacementString:
方法没有给我任何指示,表明文本字段正在被清除(基于范围或替换字符串)。因此我无法检测何时将我的继续按钮设置回禁用状态。
有什么想法吗?谢谢!
您可以使用 textFieldShouldClear
方法作为 UITextFieldDelegate
的一部分来确定是否应该禁用继续按钮。
此外,如果显式设置 属性 无效,您可以在此方法中 return NO
以防止允许清除该字段。但是,您可能需要检查标签或以其他方式防止此功能在您的用户名字段上禁用清除。
编辑:
请参阅此处列出的答案:
Note: This won't work if secureTextEntry = YES. It seems, by default, iOS clears the text of secure entry text fields before editing, no matter if clearsOnBeginEditing is YES or NO.
好的,我找到了针对该问题的不同设计解决方案,我将自己回答。我最终做的是从 shouldChangeCharactersInRange:replacementString:
中删除与更改按钮状态(启用与禁用)相关的任何逻辑
我改为让我的 class 成为 UITextFieldTextDidChangeNotification
的观察者,然后在触发通知时通过传入的方法执行按钮状态更改。这是订阅/取消订阅该通知的样子:
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textFieldDidChange:) name:UITextFieldTextDidChangeNotification object:nil];
}
- (void)viewDidDisappear:(BOOL)animated
{
[super viewDidDisappear:animated];
[[NSNotificationCenter defaultCenter]removeObserver:self];
}
然后我可以找出在我的方法中更改了哪些文本字段,如下所示:
- (void)textFieldDidChange:(NSNotification*)notification
{
UITextField *textField = (UITextField*)[notification object];
//perform logic here, change button state, etc.
}
我承认这可能不是问题的最佳(或唯一)解决方案,但它确实解决了原始问题。干杯!
我正在 iOS 上构建一个应用程序 8. 我有一个登录屏幕,用户可以在其中输入用户名和密码。当他们输入了有效的用户名和密码后,他们就可以进入下一个屏幕(启用一个按钮,允许他们前进)。
我编写了逻辑,告诉按钮何时启用或禁用自身,它基于 UITextFieldDelegate
方法:
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
此方法告诉我何时我的文本字段将更改其文本 - 非常简单。我已将密码文本字段的 secureTextEntry
属性 设置为 YES,将其 clearsOnBeginEditing
属性 设置为 NO。
当我离开密码文本框然后回到它(通过点击它里面)并输入一些东西时,文本仍然被擦除。让事情变得更加复杂的是,shouldChangeCharactersInRange:replacementString:
方法没有给我任何指示,表明文本字段正在被清除(基于范围或替换字符串)。因此我无法检测何时将我的继续按钮设置回禁用状态。
有什么想法吗?谢谢!
您可以使用 textFieldShouldClear
方法作为 UITextFieldDelegate
的一部分来确定是否应该禁用继续按钮。
此外,如果显式设置 属性 无效,您可以在此方法中 return NO
以防止允许清除该字段。但是,您可能需要检查标签或以其他方式防止此功能在您的用户名字段上禁用清除。
编辑: 请参阅此处列出的答案:
Note: This won't work if secureTextEntry = YES. It seems, by default, iOS clears the text of secure entry text fields before editing, no matter if clearsOnBeginEditing is YES or NO.
好的,我找到了针对该问题的不同设计解决方案,我将自己回答。我最终做的是从 shouldChangeCharactersInRange:replacementString:
我改为让我的 class 成为 UITextFieldTextDidChangeNotification
的观察者,然后在触发通知时通过传入的方法执行按钮状态更改。这是订阅/取消订阅该通知的样子:
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textFieldDidChange:) name:UITextFieldTextDidChangeNotification object:nil];
}
- (void)viewDidDisappear:(BOOL)animated
{
[super viewDidDisappear:animated];
[[NSNotificationCenter defaultCenter]removeObserver:self];
}
然后我可以找出在我的方法中更改了哪些文本字段,如下所示:
- (void)textFieldDidChange:(NSNotification*)notification
{
UITextField *textField = (UITextField*)[notification object];
//perform logic here, change button state, etc.
}
我承认这可能不是问题的最佳(或唯一)解决方案,但它确实解决了原始问题。干杯!