2014-10-24 3 views
1

코어 플롯 라이브러리를 사용하고 있고 데이터를 다시로드하는 것과 관련하여 주요 문제가 있습니다.reloadData를 호출 할 때 코어 플롯이 충돌합니다.

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 필요한 사항을 변경하기 위해 호출된다 :이 사람이 제 1 비교기, 다음 두 번째 비교기를 선택하고 제 1 비교기의 선택을 취소하면 내 그래프의 간격을 가질 수 있습니다

- (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)의 & & CGFloatIsValid (Y)), 기능 무효 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]; 

}

. 많은 감사합니다.

EDIT 여기서 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; 
    } 
+0

플롯 데이터에 문제가 있습니다. 데이터 소스 메소드와 그로부터 리턴되는 값을 보여주십시오. –

+0

내 질문을 편집했습니다. 감사. – pls

+0

그래프에 전송되는 플롯 데이터가 예상 한 것과 다른 것으로 의심됩니다. 플롯은 NSNull 또는 NAN 값을 건너 뜁니다. 플롯 범위 나 막대 그래프 설정이 'NAN' 막대 좌표를 유발할 수도 있습니다. 어떤 버전의 Core Plot을 사용하고 있습니까? –

답변

0

나는 충돌로부터 그것을 막을 수 있었다.

전달 된 개체가 Organization 개체가 아니면 그냥 nil을 반환했습니다. 이것은 예기치 않은 동작을 일으키는 것으로 보입니다. 대신 지금은 더미 객체를 반환하고 있습니다. 제 경우에는 제로 값의 배열입니다.

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

이것은 저에게 효과적입니다. 가장 우아한 솔루션인지 확실하지 않습니다.

+0

정말 슬픈 일입니다. – Skyler