ビューコントローラークラスのプロパティとして NSMutableArray があり、この行は他の 2 つのクラスで使用されています。クラスの 1 つは配列を操作 (オブジェクトを追加) し、別のクラスは配列から読み取るだけです。クラスの 1 つが配列を操作するとき、それがインスタンス化されているビュー コントローラー クラスで変更されていません。したがって、3 番目のクラスは必要な適切な日付を取得していません。
ビュー コントローラ クラスで:
@property (nonatomic, strong) NSMutableArray *entityLines;
他の 2 つのクラスでは:
@property (nonatomic, weak) NSMutableArray *linesToDraw;
@property (nonatomic, weak) NSMutableArray *linesForKey;
配列の初期化:
- (id)init
{
self = [super init];
if (self) {
self.title = @"Line graph";
lineQuery = [[LineGraphQuery alloc] init];
entityLines = [NSMutableArray array];
}
return self;
}
配列の変更:
- (void)drawRect:(CGRect)rect
{
if(data.namedEntityData.count > 0) {
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetLineWidth(context, LINE_WIDTH);
CGContextSetLineCap(context, kCGLineCapRound);
CGContextSetFillColorWithColor(context, [[UIColor blackColor] CGColor]);
CGContextFillRect(context, rect);
[self clearAllLines];
for(NSString *key in [data.namedEntityData allKeys]) {
EntityLine *entityLine = [self getNamedEntityLineForName:key];
if(!entityLine) {
entityLine = [[EntityLine alloc] init];
entityLine.name = key;
entityLine.color = [self getRandomColor];
}
float intervalX = STARTING_INTERVAL_X;
float lastRangeY = MIN_EVENT_COUNT_Y;
CGContextSetStrokeColorWithColor(context, [entityLine.color CGColor]);
NSArray *events = [data.namedEntityData objectForKey:key];
NSInteger rangeDifference = data.endYear - data.beginYear;
for(int i = 0; i < numberOfDateRangeIntervals; i++) {
int startYearRange = data.beginYear + (i * (rangeDifference / numberOfDateRangeIntervals));
int endYearRange = (i == numberOfDateRangeIntervals - 1) ? data.endYear : data.beginYear + ((i + 1) * (rangeDifference / numberOfDateRangeIntervals) - 1);
int eventCount = [self getCountForEvents:events withBeginYear:startYearRange andEndYear:endYearRange];
Line *line = [[Line alloc] init];
line.begin = CGPointMake(intervalX, lastRangeY);
CGContextMoveToPoint(context, line.begin.x, line.begin.y);
intervalX += intervalXIncrement;
lastRangeY = [self getYCoordinateForEventCount:eventCount];
line.end = CGPointMake(intervalX, lastRangeY);
[entityLine addLine:line];
CGContextAddLineToPoint(context, line.end.x, line.end.y);
CGContextStrokePath(context);
}
[linesToDraw addObject:entityLine];
}
[self drawEventCountLabelsWithContext:context];
[self drawDateRangeLabelsWithContext:context];
}
}
- (void)clearAllLines
{
for(EntityLine *line in linesToDraw)
[line clearLines];
}
NSMutableArray への参照を設定するその他のクラス:
lineGraph.linesToDraw = self.entityLines;
lineKey.linesForKey = self.entityLines;