0

我有一个奇怪的困境,我似乎无法解决这个问题,并且在试图解决这个问题时需要一些外部帮助。我有一个从文本框中读取的 NSString 值,并将其转换为 NSNumber。这很好用,我得到了我的价值。然后我取我的新数字,我想将它与一个由 4 个浮点数组成的数组进行比较。然而,当我尝试比较时,我从来没有得到正确的结果,这就是我把头发拉出来的地方。下面是一小段代码,解释了我的情况:

// THE FIRST IF STATEMENT IS WHAT GETS SELECTED
// newValue = 0.93
// colorRange = {0.10, 0.20, 0.80, 0.90 }
NSNumberFormatter *format = [[NSNumberFormatter alloc] init];
[format setNumberStyle:NSNumberFormatterDecimalStyle];
NSNumber *newValue = [format numberFromString:value];
[format release];

if (newValue < [colorRange objectAtIndex:0]) {
    // Red background
    selectedButton.backgroundColor = [UIColor redColor];
}
else if (newValue > [colorRange objectAtIndex:0] && newValue < [colorRange objectAtIndex:1]) {
    // White background
    selectedButton.backgroundColor = [UIColor whiteColor];
}
else if (newValue > [colorRange objectAtIndex:1] && newValue < [colorRange objectAtIndex:2]) {
    // Black background
    selectedButton.backgroundColor = [UIColor blackColor];
}
else if (newValue > [colorRange objectAtIndex:2] && newValue < [colorRange objectAtIndex:3]) {
    // Blue background
    selectedButton.backgroundColor = [UIColor blueColor];
}
else {
    // Green background
    selectedButton.backgroundColor = [UIColor greenColor];
}

我想要做的是查看我的输入值在我的百分比范围内的位置,并根据该信息选择一种颜色。如果有更优化的方法,请告诉我。

4

5 回答 5

4

您不能像这样直接比较 NSNumber,因为您正在比较它们的指针的值。相反,使用compareNSNumber 的方法来比较它们,如下所示:

if ([newValue compare:[colorRange objectAtIndex:0]] == NSOrderedAscending) {
    // Red background
    selectedButton.backgroundColor = [UIColor redColor];
}  
...
于 2012-09-27T20:15:30.683 回答
3

我会以简单的方式做到这一点:

if ([newValue floatVaue] < [colorRange objectAtIndex:0] floatValue])

它是。

于 2012-09-27T20:19:30.967 回答
3

这个(和其他人喜欢它):

newValue < [colorRange objectAtIndex:1]

将指针newValue与指针进行比较[colorRange objectAtIndex:1]newValue因此,如果恰好在内存中较低,它将评估为非零。

至少有两张海报被打败了,我会花时间提出更紧凑的方法:

NSArray *backgroundColours = @[ [UIColor redColor], [UIColor whiteColor], ...];
NSUInteger index = 0;
for(NSNumber *colour in colorRange)
{
    if([newValue compare:colour] == NSOrderedAscending)
    {
        selectedButton.backgroundColor = [backgroundColours objectAtIndex:index];
        break;
    }
    index++;
}
于 2012-09-27T20:20:26.933 回答
2

您不能使用or运算符比较NSNumber*对象:它比较指针,给您任意结果。请改用以下方法:<>compare:

if ([newValue compare:[colorRange objectAtIndex:0]] == NSOrderedAscending) ...
  • NSOrderedAscending表示接收者小于参数
  • NSOrderedDescending表示接收者大于参数
  • NSOrderedSame表示接收者等于参数
于 2012-09-27T20:15:37.953 回答
0

正如其他人所说,你不能像那样比较指针,只能比较变量。你可以使用

if ([newValue floatValue]<[[color objectAtIndex:0] floatValue]
于 2012-09-27T20:21:48.740 回答