检测是否在 UITextField 中插入了一个字符

Detect whether a character was inserted in UITextField

我有一个UITextField。我想检测某个字符是否被估算。这是我尝试过的

-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    for (int i = 0; i < [textField.text length]; i++) {
        if ([textField.text characterAtIndex:i] == @".") { // Error Here
            ...
        }
    }
}

我收到一个错误

Comparison between pointer and integer ('int' and 'NSStirng ')

所以我的做法显然是错误的。我的问题是我该如何解决这个问题?

您应该考虑使用:- (NSRange)rangeOfString:(NSString *)aString

更新
NSString *string1 = @"The quick brown fox jumped";
NSRange match;
match = [string1 rangeOfString: @"brown fox"];

if (match.location == NSNotFound)
          NSLog (@"Match not found");
else
          NSLog (@"match found");

当它应该返回变量类型 "char" 时,您将其与字符串进行比较。您应该使用单引号而不是双引号。试试这个:

if([textField.text characterAtIndex:i]=='.')
    //DoSomething

这个怎么样?

if ([textField.text characterAtIndex:i] == [@".".characterAtIndex:0])

您不希望在 textField:shouldChangeCharactersInRange:replacementString: 方法中使用该循环,因为每次对 textField 进行更改(添加字符、删除字符)时都会调用该方法性格等)。意思是,你的循环将 运行 textField.text.length 任何时候 textField.text.

进行了更改

循环太多:


中所述,调用此方法以确定 是否应进行更改 。此外,因为您正在检查 . 而不是 string,所以您的条件不会是 TRUE,直到在 after 添加 .

也叫过Late/Often:

以上是做什么的?当我们遇到 . 时,我将你的循环与已接受的答案一起使用,并在 运行 中添加了 NSLog。 我先输入 123,输入 . 后稍作停顿。您可以看到,尽管键入了 .,但在我键入下一个数字之前,NSLog 并没有真正发生。此外,NSLog 语句现在将在每个新字符上 运行 -- 为每个后续 .

增加日志消息的数量

还有什么选择?好吧,这取决于遇到 . 时您需要代码执行的操作。但是为了确保您在正确的时间执行代码,我会

  1. textField:shouldChangeCharactersInRange:replacementString: 中检查 string(不是 textField.text).. 对于此检查,它要简单得多: if( [string isEqualToString:@"."] ){ // Do something }

  1. 使用我发布的 link 作为指南,并使文本字段成为编辑通知的目标。

最后,为什么这个问题值得用视觉辅助工具回答这么长的问题?您的问题以及随后的回复是一个很好的例子,说明如何在您的代码中引入一个微妙的错误并仍然获得所需的结果。 NSLog 将成为您最信任的盟友之一;自由地使用它来解构错误并通过逆向工程为您的编码解决方案 problems/questions.