核心图在调用reloadData时崩溃

时间:2014-10-24 14:43:35

标签: ios objective-c ios8 core-plot

我正在使用核心绘图库,并且在重新加载数据方面存在重大问题。

我有一个视图,只显示2个静态图表,并且工作正常。但是我有另一种需要更新表的视图。

由于课程很大,我不确定需要提供多少信息。因此,从小开始,如果需要,将添加更多。

我的工作方式是我有一个包含占位符NSNull值的NSArray。

- (NSMutableArray *)organisationsToDisplay 
{
    if (_organisationsToDisplay == nil) {
        NSNull *placeHolder = [NSNull null];
        _organisationsToDisplay = [NSMutableArray arrayWithObjects:placeHolder, placeHolder, placeHolder, placeHolder, placeHolder, nil];
    }
    return _organisationsToDisplay;
 }

我有这个,因为我一直用它来容纳2个物体并加起来3个比较器。始终保持两个对象直接添加。其他3个仍为[NSNull值]。我检查数组中的特定对象是否为NSNull,如果是,我将其替换为所选对象。在调用reloadData之前,调用以下代码进行必要的更改:

- (void)updateGraphWithNewComparator:(NSIndexPath *)indexPath
{
    for (int i = 0; i < [self.organisationsToDisplay count]; i++) {
        if (self.organisationsToDisplay[i] == [NSNull null]) {
            self.organisationsToDisplay[i] = self.comparatorList[indexPath.row];
            [self.organisationKeyViews[i] setHidden:NO];
            [self.organisationKeyViews[i] titleLabel].text = [self.comparatorList[indexPath.row] name];
            break;
        }
     }
    [self updateGraph:Unknown];
}

如果有人选择了第一个比较器,然后是第二个比较器,然后取消选择第一个比较器,那么这允许我在图表中留有间隙。

这是在5.1.1上的模拟器上工作但不适用于该设备。一旦你点击一个比较器,它就会崩溃。现在我已升级到xcode 6,它在模拟器上做同样的事情。

此外,自升级到Xcode 6后,我收到以下错误:断言失败:(CGFloatIsValid(x)&amp;&amp; CGFloatIsValid(y)),函数void CGPathMoveToPoint(CGMutablePathRef,const CGAffineTransform *,CGFloat,CGFloat) ,文件路径/ CGPath.cc,第254行。

以下是崩溃时的主题:

enter image description here

我真的很感激任何帮助。如果您需要更多信息,请不要犹豫。

修改

这是我的这两种方法的基类实现。然后我在每个类中覆盖它们以提供数据。应用程序崩溃了这个基本版本。

我检查要使用的对象是否属于类型组织,好像我不抱怨它是一个NSNull对象。第二个占位符有很多数组,因为我不得不做一个比较图。

#pragma mark Populating and updating arrays
// Method needs to be overwritten to produce different data.
- (NSArray *)populateDataArray:(Organisation *)organisation option:(DataOptions)selectedOption
{
    if (selectedOption == PlaceholderOne) {
        if ([organisation isKindOfClass:[Organisation class]]) {
            return @[[NSNumber numberWithInt:50],
                     [NSNumber numberWithInt:50],
                     [NSNumber numberWithInt:50],
                     [NSNumber numberWithInt:50],
                     ];
        }
    }
else if (selectedOption == PlaceHolderTwo) {
    if ([organisation isKindOfClass:[Organisation class]]) {
        return @[@[[NSNumber numberWithInt:10],
                   [NSNumber numberWithInt:20],
                   [NSNumber numberWithInt:30],
                   [NSNumber numberWithInt:40],
                   [NSNumber numberWithInt:50],
                   [NSNumber numberWithInt:60],
                   ], @[[NSNumber numberWithInt:60],
                        [NSNumber numberWithInt:50],
                        [NSNumber numberWithInt:40],
                        [NSNumber numberWithInt:30],
                        [NSNumber numberWithInt:20],
                        [NSNumber numberWithInt:10]
                        ], @[[NSNumber numberWithInt:10],
                             [NSNumber numberWithInt:20],
                             [NSNumber numberWithInt:30],
                             [NSNumber numberWithInt:40],
                             [NSNumber numberWithInt:50],
                             [NSNumber numberWithInt:60],
                             ], @[[NSNumber numberWithInt:10],
                                  [NSNumber numberWithInt:20],
                                  [NSNumber numberWithInt:30],
                                  [NSNumber numberWithInt:40],
                                  [NSNumber numberWithInt:50],
                                  [NSNumber numberWithInt:60],
                                  ]];
    }
}
else if (selectedOption == PlaceholderThree) {
    if ([organisation isKindOfClass:[Organisation class]]) {
        return @[[NSNumber numberWithInt:50]];
    }
}
else if (selectedOption == PlaceholderFour) {
    if ([organisation isKindOfClass:[Organisation class]]) {
        return @[[NSNumber numberWithInt:50]];
    }
}

return nil;

}

#pragma mark - CPTPlotDataSource methods
-(NSUInteger)numberOfRecordsForPlot:(CPTPlot *)plot {
    return [self.organisationValues count];
}

-(NSNumber *)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index {

if ((fieldEnum == CPTBarPlotFieldBarTip) && (index < [self.organisationValues count])) {
    if ([plot.identifier isEqual:@"national"]) {
        return self.organisationValues[index];
    }
    else if ([plot.identifier isEqual:@"organisational"]) {
        return self.organisationValues[index];
    }
    else if ([plot.identifier isEqual:@"comparatorOne"]) {
        return self.comparatorOneValues[index];
    }
    else if ([plot.identifier isEqual:@"comparatorTwo"]) {
        return self.comparatorTwoValues[index];
    }
    else if ([plot.identifier isEqual:@"comparatorThree"]) {
        return self.comparatorThreeValues[index];
    }

    else if ([plot.identifier isEqual:@"natYear2011"]) {
        return self.organisationValues[index][0];
    }
    else if ([plot.identifier isEqual:@"orgYear2011"]) {
        return self.organisationValues[index][1];
    }
    else if ([plot.identifier isEqual:@"natYear2012"]) {
        return self.organisationValues[index][2];
    }
    else if ([plot.identifier isEqual:@"orgYear2012"]) {
        return self.organisationValues[index][3];
    }
    else if ([plot.identifier isEqual:@"natYear2013"]) {
        return self.organisationValues[index][4];
    }
    else if ([plot.identifier isEqual:@"orgYear2013"]) {
        return self.organisationValues[index][5];
    }
    else if ([plot.identifier isEqual:@"orgYear2013"]) {
        return self.organisationValues[index][6];
    }
}

return [NSDecimalNumber numberWithFloat:index];

}

如果您需要更多信息,请告诉我们。非常感谢。

编辑2

以下是重写类的示例。我已经改变了必须更改数据和切换语句的名称:

#pragma mark Populating and updating arrays
- (NSArray *)populateDataArray:(Organisation *)organisation option:(DataOptions)selectedOption
{
    if (selectedOption == DATA_ONE) {
        if ([organisation isKindOfClass:[Organisation class]]) {
            return @[organisation.population.rate_20_25,
                     organisation.population.rate_26_30,
                     organisation.population.rate_31_35,
                     organisation.population.rate_36_40

    }
    }
    else if (selectedOption == DATA_TWO) {
        return nil;
    }
    else if (selectedOption == DATA_THREE) {
        if ([organisation isKindOfClass:[Organisation class]]) {
            return @[organisation.population.rate_20_40];
        }
    }
    else if (selectedOption == DATA_FOUR) {
        if ([organisation isKindOfClass:[Organisation class]]) {
            return @[organisation.population.rate_20_50];
        }
    }

    return nil;
    }

1 个答案:

答案 0 :(得分:0)

我设法阻止它崩溃。

如果传入的对象不是Organization对象,那我只是返回nil。这似乎会导致意外行为。我现在正在返回一个虚拟对象。在我的例子中,它是一个零值数组。

- (NSArray *)emptyDataForNullGraph
{
    NSNumber *zero = [NSNumber numberWithInt:0];
    return @[zero,zero,zero,zero,zero,zero,zero,zero,zero,zero];
}

这对我有用。不确定它是否是最优雅的解决方案。