检测是否在 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
语句现在将在每个新字符上 运行 -- 为每个后续 .
增加日志消息的数量
还有什么选择?好吧,这取决于遇到 .
时您需要代码执行的操作。但是为了确保您在正确的时间执行代码,我会
- 在
textField:shouldChangeCharactersInRange:replacementString:
中检查 string
(不是 textField.text
).. 对于此检查,它要简单得多:
if( [string isEqualToString:@"."] ){ // Do something }
或
- 使用我发布的 link 作为指南,并使文本字段成为编辑通知的目标。
最后,为什么这个问题值得用视觉辅助工具回答这么长的问题?您的问题以及随后的回复是一个很好的例子,说明如何在您的代码中引入一个微妙的错误并仍然获得所需的结果。 NSLog
将成为您最信任的盟友之一;自由地使用它来解构错误并通过逆向工程为您的编码解决方案 problems/questions.
我有一个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
语句现在将在每个新字符上 运行 -- 为每个后续 .
还有什么选择?好吧,这取决于遇到 .
时您需要代码执行的操作。但是为了确保您在正确的时间执行代码,我会
- 在
textField:shouldChangeCharactersInRange:replacementString:
中检查string
(不是textField.text
).. 对于此检查,它要简单得多:if( [string isEqualToString:@"."] ){ // Do something }
或
- 使用我发布的 link 作为指南,并使文本字段成为编辑通知的目标。
最后,为什么这个问题值得用视觉辅助工具回答这么长的问题?您的问题以及随后的回复是一个很好的例子,说明如何在您的代码中引入一个微妙的错误并仍然获得所需的结果。 NSLog
将成为您最信任的盟友之一;自由地使用它来解构错误并通过逆向工程为您的编码解决方案 problems/questions.