核心情节数据源返回大量数字

时间:2014-11-14 11:31:48

标签: ios objective-c core-plot scatter-plot

我在核心图中实现了一个散点图,其中一个数据源方法正在返回一个巨大的数字。这是方法:

- (NSUInteger)numberOfRecordsForPlot:(CPTPlot *)plot {
    return [self.values count];
}

- (NSNumber *)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index
{
    switch (fieldEnum) {
        case CPTScatterPlotFieldX:
            if (index < [self.practices count]) {
                return [NSNumber numberWithUnsignedInteger:index];
            }
            break;

        case CPTScatterPlotFieldY:

            if ([plot.identifier isEqual:@"Practices"]) {
                return self.values[index];
            }
            break;
    }
    return [NSDecimalNumber zero];
}

以下是自我价值的数量:

    NSMutableArray *value = [[NSMutableArray alloc] initWithCapacity:200];

    for (int i = 200; i > 0; i--) {
        NSInteger randomNumber = arc4random() % 200;
        [value addObject:[NSNumber numberWithInt:randomNumber]];
    }

    NSSortDescriptor *highestToLowest = [NSSortDescriptor sortDescriptorWithKey:@"self" ascending:NO];
    [value sortUsingDescriptors:[NSArray arrayWithObject:highestToLowest]];

    self.values = [value copy];

图表在调用时会崩溃:return self.values[index];。当我尝试调试应用程序时,我发现传入的索引非常大。

这是该变量的图片。它是一个叫做索引的人:

enter image description here

我想弄清楚为什么这个数字太大了。一切似乎都与我实施的其他图表相似。然而,这似乎投入了大量资金。

1 个答案:

答案 0 :(得分:0)

我已经设法找到了解决这个问题的方法。我的原始代码没有检查CPTScatterPlotFieldY以查看是否index < [self.values count]

switch (fieldEnum) {
    case CPTScatterPlotFieldX:
        if (index < [self.values count]) {
            return [NSNumber numberWithUnsignedInteger:index];
        }
        break;

    case CPTScatterPlotFieldY:

        if ([plot.identifier isEqual:@"gpPractices"] && index < [self.values count]) {
            return self.values[index];
        }
        break;
}
return [NSDecimalNumber zero];

通过添加此检查,如果索引小于数组中的对象数,它只会尝试访问self.values数组。