キーが NSValues に変換された CGPoints であり、オブジェクトが UIColors である NSDictionary オブジェクトにデータがあります。辞書からオブジェクトを返すために使用しているメソッドは次のとおりです。
- (UIColor*) getTemperatureColor2 {
NSDictionary* temperatureColorMap = [Weather getTemperatureColorMap];
for(id key in temperatureColorMap) {
CGPoint point = [key CGPointValue];
if ( (int)roundf(self.temperature_celsius) >= (int)roundf(point.x) ) {
if ( (int) roundf(self.temperature_celsius) <= (int) roundf(point.y) ) {
return [temperatureColorMap objectForKey:key];
}
}
}
return [UIColor blackColor];
}
これは getTemperatureColorMap メソッドで、同じクラス (Weather) に実装されています。
+ (NSDictionary*) getTemperatureColorMap {
static NSDictionary* temperatureColorMap = nil;
if (temperatureColorMap == nil) {
temperatureColorMap = [[[NSDictionary alloc] initWithObjectsAndKeys:
RGB2UIColor(0x0E09EE), [NSValue valueWithCGPoint: CGPointMake(-99, -8)],
RGB2UIColor(0xB85FC), [NSValue valueWithCGPoint: CGPointMake(-7, -3) ],
RGB2UIColor(0x0BDCFC), [NSValue valueWithCGPoint: CGPointMake(-2, 2) ],
RGB2UIColor(0x1BBA17), [NSValue valueWithCGPoint: CGPointMake(3, 7) ],
RGB2UIColor(0x45F90C), [NSValue valueWithCGPoint: CGPointMake(8, 12) ],
RGB2UIColor(0xF9F60C), [NSValue valueWithCGPoint: CGPointMake(13, 17) ],
RGB2UIColor(0xF9B20C), [NSValue valueWithCGPoint: CGPointMake(18, 22) ],
RGB2UIColor(0xF9780C), [NSValue valueWithCGPoint: CGPointMake(23, 27) ],
RGB2UIColor(0xFE3809), [NSValue valueWithCGPoint: CGPointMake(28, 32) ],
RGB2UIColor(0xFE0909), [NSValue valueWithCGPoint: CGPointMake(33, 99) ], nil] autorelease];
}
return temperatureColorMap;
}
getTemperatureColor2 を for ループ (すべてのウェイポイントを通過する) で呼び出します。これはすべて drawRect メソッドにあります。ウェイポイントには気象オブジェクトが含まれています。
routeAnnotation.lineColor = [fromWaypoint.weather getTemperatureColor2];
ビューが読み込まれると、drawRect メソッドが 2 回呼び出されます (効果のためにこれが必要です)。1 回目はすべて問題ありませんが、2 回目はコードが for ループの高速列挙に到達するとすぐに例外が発生します。
2010-01-15 11:40:42.224 AppName[1601:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[Waypoint countByEnumeratingWithState:objects:count:]: unrecognized selector sent to instance 0x856d170'
Waypoint は NSDictionary であるため、エラーがどのように発生するのかわかりません。また、繰り返しが失敗するために drawRect をもう一度呼び出す必要がある理由がまったくわかりません。