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したがって、メモリ内でたまたま下位にある場合は、ゼロ以外と評価されます。

少なくとも2つのポスターでそれを言うことに殴られたので、私はよりコンパクトな方法を提案するために時間をかけます:

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 に答える