UITextField secureEntry不尊重clearsOnBeginEditing属性

时间:2015-02-10 20:38:51

标签: ios objective-c uitextfield

我正在iOS 8上构建一个应用程序。我有一个登录屏幕,用户输入用户名和密码。当他们输入有效的用户名和密码时,他们可以移动到下一个屏幕(一个按钮变为启用状态,允许他们前进)。

我写了逻辑,告诉按钮何时启用或禁用自身,这是基于UITextFieldDelegate方法:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string

这个方法告诉我我的文本字段何时会改变他们的文本 - 非常简单。我已将密码文本字段的secureTextEntry属性设置为YES,将其clearsOnBeginEditing属性设置为NO。

当我离开密码文本字段然后返回它(通过单击其中)并键入内容时,文本仍会被擦除。事情变得更复杂,shouldChangeCharactersInRange:replacementString:方法没有给我任何关于文本字段被清除的指示(基于范围或替换字符串)。所以我无法检测何时将继续按钮设置为禁用。

有什么想法?谢谢!

2 个答案:

答案 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都会在编辑前清除安全输入文本字段的文本。