输入每个字符后验证文本字段

时间:2011-09-25 19:29:19

标签: iphone uitextfield

我已经找到了答案,但无法找到与此相关的答案。

我正在尝试验证文本字段中的每个输入,但不确定如何进行,想法是检查服务器上存在的用户名,因此我假设每次输入内容时都需要发送到服务器如果成功做任何事情。

有人可以告诉我,我将不胜感激。

3 个答案:

答案 0 :(得分:3)

实施委托方法textField:shouldChangeCharactersInRange:replacementString:以了解文本的每个更改。返回YESNO,具体取决于您是否要接受更改。

要求服务器批准每一个按键可能是一个非常糟糕的主意,因为这会造成无法忍受的延迟并导致非常糟糕的用户体验。

答案 1 :(得分:2)

Ole所说的是绝对正确的。我只想举例说明他的意思。

首先使您的班级符合UITextFieldDelegate协议。然后在viewDidLoad(或类似)中确保将委托设置为您的班级:

myTextField.delegate = self;

接下来,您可以实现Ole提到的方法。但是,在您的情况下,您没有验证用户是否可以输入任何内容,您只想知道他输入了什么,以便您可以在线验证。

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    [self verifyTheUserWithUsername:[textField.text stringByReplacingCharactersInRange:range withString:string]];
    //do your appropriate check here
    return YES; //we allow the user to enter anything
}

答案 2 :(得分:2)

您可以将addTarget:action:forControlEvents:UIControlEventValueChanged一起使用(例如:[textfield addTarget:self action:@selector(usernameChanged:) forControlEvents:UIControlEventValueChanged)。这将在文本更改后通知您(因此当您收到usernameChanged:时,您将进行最后的修改。)

每次用户名更改时,不是向服务器发送请求,而是在文本字段丢失标题或从最后一次更改过去一段时间后发送请求(您可以使用{{1}),这可能是一个好主意。为了这个)。

您应该使用单个异步请求。如果请求处于活动状态且再次编辑文本字段,则应取消请求并将其设置为nil(因为没有理由检查旧用户名)。如果请求成功,则显示一个图标,或者当您从服务器获得结果时要执行的任何操作。

修改 不确定NSTimer是否适用于以前版本的iOS,或者是否是我身边的错误,但它似乎不再起作用。应该使用UIControlEventValueChanged代替。