我正在iOS 8上构建一个应用程序。我有一个登录屏幕,用户输入用户名和密码。当他们输入有效的用户名和密码时,他们可以移动到下一个屏幕(一个按钮变为启用状态,允许他们前进)。
我写了逻辑,告诉按钮何时启用或禁用自身,这是基于UITextFieldDelegate
方法:
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
这个方法告诉我我的文本字段何时会改变他们的文本 - 非常简单。我已将密码文本字段的secureTextEntry
属性设置为YES,将其clearsOnBeginEditing
属性设置为NO。
当我离开密码文本字段然后返回它(通过单击其中)并键入内容时,文本仍会被擦除。事情变得更复杂,shouldChangeCharactersInRange:replacementString:
方法没有给我任何关于文本字段被清除的指示(基于范围或替换字符串)。所以我无法检测何时将继续按钮设置为禁用。
有什么想法?谢谢!
答案 0 :(得分:1)
好的,我发现了一个不同的设计解决方案,我将自己回答。我最终做的是从shouldChangeCharactersInRange:replacementString:
删除与更改按钮状态(启用与禁用)相关的任何逻辑
我改为使我的班级成为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.
}
我承认这可能不是问题的最佳(或唯一)解决方案,但它确实解决了原始问题。干杯!
答案 1 :(得分:0)
您可以使用textFieldShouldClear
方法作为UITextFieldDelegate
的一部分来确定是否应禁用“继续”按钮。
此外,您可以在此方法中返回NO
,以便在明确设置其属性不起作用时不允许该字段清除。但是,您可能需要检查标记或其他方式,以防止在您的用户名字段中禁用此选项。
修改强> 请参阅此处列出的答案:https://stackoverflow.com/a/7305603/2845237
注意:如果 secureTextEntry = YES ,则 。默认情况下,无论 clearsOnBeginEditing 是YES还是NO,iOS都会在编辑前清除安全输入文本字段的文本。