Линейный график CGPoints из NSMutableArray - PullRequest
0 голосов
/ 11 января 2011

Я пытался адаптировать код из примера акселерометра таким образом, чтобы при нажатии пользователем uibutton точка добавлялась к линейному графику.

Работа над преобразованием двух чисел с плавающей запятой, которые являются результатом вычисления, как показано ниже, в CGPoint и преобразования CGPoint в значение NSValue, а затем добавление его в массив NSMutableArray со следующим

-(IBAction)calculate:(id)sender {   
    self.points = [NSMutableArray array];
    CGPoint pt = CGPointMake(d, c);
    [self.points addObject:[NSValue valueWithCGPoint:pt]];
    NSLog(@"%@", NSStringFromCGPoint(pt));
    NSLog(@"%@", [NSString stringWithFormat:@"%d points", self.points.count ]);
}   

Но по какой-то причине я получаю только один объект, сохраненный в массиве, кажется, что каждый раз, нажимая кнопку вычисления, объект pt перезаписывается, с положительной стороны он имеет правильные координаты x, y.Есть идеи на этот счет?

ОБНОВЛЕНИЕ

Удалено self.points = [NSMutableArray array];и поместил его в вид, сделал загрузку, также установил первые точки на 0,0.так что работает нормально.Теперь следующая проблема заключается в том, что у меня есть подкласс Graph, где происходит CG Drawing.Я пытаюсь найти простой способ получить доступ к вышеуказанному NSMutableArray, который находится в классе ViewController из класса графа.

Я так близок к концу, но действительно застрял, любая помощь была бы полезна,Все еще пытаюсь нарисовать линейный график на UIView, который находится на UIScrollview.Прямоугольный метод рисования находится в подклассе UIView, и там все работает, у меня есть линии сетки и метки на оси, и я могу рисовать на нем вручную.Но проблема у меня заключается в том, что я не могу прочитать NSMutableArray CGPoints, которые являются координатами x и y.ViewController выполняет вычисления, и результаты записываются в массив NSMutable, и все это также работает нормально, я вижу, как CGpoints и их значения записываются с помощью NSLogs в ViewController.Я пробовал различные способы установить NSMutableArray как глобальный, но безрезультатно, все работает, но хотя я вижу точки, записываемые в ViewController, они просто не видны подклассу UIView.Я также пытался использовать методы addObserver и наблюдайте за ValueForKeyPath и еще раз, пока все работает, подкласс не может видеть массив.Любые идеи, предложения, советы или мысли будут великолепны

Ответы [ 2 ]

0 голосов
/ 13 января 2011

Все получилось, и мы многому научились, просто из интереса общий план конечного продукта:

  • ViewController с ScrollView и UIView для графика
  • Подкласс UIView для обработки класса
  • Singleton для массива NSMutable, чтобы ViewController мог записывать в него значения, а подкласс UIView может считывать значения для рисования графика.

этосоответствующий код из подкласса UIview

- (void)drawRect:(CGRect)rect {

    float what = self->m_Val1;
    NSLog(@"what %f",what);

    CGContextRef ctx = UIGraphicsGetCurrentContext();
    CGColorRef black = [[UIColor blackColor] CGColor];

    // Draw the grid lines
    DrawGridlines(ctx, 0.0, 200);


    // Draw the text
    UIFont *systemFont = [UIFont systemFontOfSize:12.0];
    [[UIColor whiteColor] set];
    [@"20" drawInRect:CGRectMake(2.0, 1.0, 24.0, 16.0) withFont:systemFont lineBreakMode:UILineBreakModeWordWrap alignment:UITextAlignmentLeft];
    [@"15" drawInRect:CGRectMake(2.0, 50.0, 24.0, 16.0) withFont:systemFont lineBreakMode:UILineBreakModeWordWrap alignment:UITextAlignmentLeft];
    [@"10" drawInRect:CGRectMake(2.0, 100.0, 24.0, 16.0) withFont:systemFont lineBreakMode:UILineBreakModeWordWrap alignment:UITextAlignmentLeft];
    [@"5" drawInRect:CGRectMake(2.0, 150.0, 24.0, 16.0) withFont:systemFont lineBreakMode:UILineBreakModeWordWrap alignment:UITextAlignmentLeft];


    if (what < 1) return;

    CGContextSetStrokeColorWithColor(ctx, black);
    CGContextSetLineWidth(ctx, 4.0f);
    MySingleton     *resultsInstance = [MySingleton instance];
    NSLog(@"From Graph view Count: %d", [[resultsInstance getArray] count]);
    float counthis =([[resultsInstance getArray] count]);
    for (int i = 0; i < (counthis-1); i++)
    {
        CGPoint pt1 = [[[resultsInstance getArray] objectAtIndex:i]CGPointValue]; 
        CGPoint pt2 = [[[resultsInstance getArray] objectAtIndex:i+1]CGPointValue]; 
        CGContextMoveToPoint(ctx, pt1.x, pt1.y);
        CGContextAddLineToPoint(ctx, pt2.x, pt2.y);
        CGContextStrokePath(ctx);
        NSLog(@"cgpoint %@", NSStringFromCGPoint(pt1));
        NSLog(@"point x,y: %f,%f", pt1.x, pt1.y);

    }

}
0 голосов
/ 11 января 2011

Похоже, что все ваши значения trackcalc [] равны нулю. Что, в свою очередь, предполагает, что [vallres.text floatValue] возвращает 0.

[NSString floatValue] возвращает ноль, когда не может вернуть число.

floatValue

Возвращает значение с плавающей точкой получателя текст в виде числа с плавающей точкой.

- (float) floatValue

Возвращаемое значение

Значение с плавающей точкой получателя текст как поплавок, пропуская пробелы в начале строки. Возвращает HUGE_VAL или –HUGE_VAL в переполнение, 0,0 при переполнении. Также возвращает 0.0, если получатель не начать с правильного текстового представления числа с плавающей точкой.

...