我正在做一个按钮计算器应用程序(静止),用户按下按钮,我将一个值存储到一个字符串中以显示在文本框中,然后在用户输入=按钮时转换为浮点数。
大部分工作都很好,除了我无法弄清楚如何阻止用户在单个字符串中输入多个小数。我想过将它传递给BOOL方法,但我的课程材料都没有涵盖任何方法。
我查看了这个Stack溢出问题,但是尝试修改我自己的代码只会导致一大堆错误。有没有人有任何建议?
-(IBAction) decimal
{
NSString *decVal =@".";
NSRange range = [decVal rangeOfString:@"."];
if (range.location==NSNotFound)
{
display.text = [display.text stringByAppendingString:decVal];
}
else
{
NSLog(@"You can't enter more than one decimal");
}
}
答案 0 :(得分:1)
-(IBAction) decimal
{
static NSString *decVal =@".";
NSRange range = [display.text rangeOfString:decVal];
if (NSNotFound == range.location)
{
display.text = [display.text stringByAppendingString:decVal];
}
else
{
NSLog(@"You can't enter more than one decimal");
}
}
你错过了一个字符串。 [decVal rangeOfString:@"."]
将始终返回范围{0,1}。
答案 1 :(得分:0)
处理此问题的一种方法是设置文本字段/视图的委托,然后在委托中实现shouldChangeCharactersInRange
。
例如,您可以执行以下操作:
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
BOOL hasPeriod = ([textField.text rangeOfString:@"."].location != NSNotFound);
BOOL removingPeriod = ([[textField.text substringWithRange:range]
rangeOfString:@"."].location != NSNotFound);
BOOL addingPeriod = ([string rangeOfString:@"."].location != NSNotFound);
return (hasPeriod && addingPeriod && !removingPeriod) ? NO : YES;
}
这不会引发错误。它只是赢得了第二个时期。不过,您可以轻松添加错误消息。