-1

ビューコントローラークラスのプロパティとして 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;
4

1 に答える 1

1

プロパティ (またはインスタンス変数) に異なるクラスで同じ名前を付けても、同じオブジェクトを指すことにはなりません。配列を作成したら、配列へのポインタを他のクラス インスタンスのプロパティに渡す必要があります。

@interface ABCFirstClass ()

@property (nonatomic, strong) NSMutableArray *lines;
@property (nonatomic, strong) ABCAnotherClass *otherClass;  // Also has a property named "lines".

@end


@implementation ABCFirstClass

- (id)init
{
    self = [super init];
    if (self) {
        self.lines = [NSMutableArray arrayWithObjects:@"1", @"2", @"3", nil];
        self.otherClass = [[ABCAnotherClass alloc] init];
        self.otherClass.lines = self.lines;
          // Now both classes have a pointer to the same array object.
    }
    return self;
}

これは、-init メソッドで発生する必要はありません。おそらく、まったく異なるクラスが一方からポインターを取得し、それを他方に渡します。

通常は ivar を -init (_lines, _otherClass) で直接操作しますが、この例は単純にしたかったことに注意してください。

于 2013-05-21T18:15:45.387 に答える