2011-12-01 72 views
0

上下文是我试图绘制一系列温度作为图表。这为什么不绘制路径?

在我的应用程序的工作方式如下(据我所知)的那一刻:

应用程序将打开,OPENFILE使用哪种初始化我的文档类这种读取修改后的CSV文件导入到一个NSString“fileContents”然后我分离成一个字符串数组,每个字符串都包含没有分隔符或空格的值。如下:

NSArray *temps = [fileContents componentsSeparatedByCharactersInSet: [NSCharacterSet characterSetWithCharactersInString:@"\n|\r"]]; 

之后我初始化我的自定义视图中,TemperatureGraph类,并立即将它传递成为在下面的代码看到的currentlog阵列。实例ID是当前的。

最后,我调用:

[current drawpath]; 

这是下面的实例方法:

- (void) drawpath 
{ 
    NSBezierPath *program = [NSBezierPath bezierPath]; 
    NSPoint st = NSMakePoint(0, 0); 

    [program moveToPoint:st]; 
    [program setLineWidth:10]; 
    [program setLineCapStyle:NSRoundLineCapStyle]; 
    [[NSColor blueColor] setStroke]; 
    [program stroke]; 

    NSUInteger a, b; 
    a = [currentlog count]; 
    b = 0; 
    while (b <= a) { 
     NSPoint new; 
     float x; 
     x = 5 * b; 

     new = NSMakePoint(x, [[currentlog objectAtIndex:b] floatValue]); 
     [program lineToPoint:new]; 
     [program stroke]; 
     b += 6; 
    } 
} 

为什么不工作?定义不起作用:应用程序编译并运行,但我有一个空白窗口。

另外请指出在那里,但不影响代码的任何菜鸟错误,因为我仍然在这里的学习阶段。

回答

2

除非您有活动的图形上下文,否则绘图不会发生。我假设上面的drawpath方法在NSView子类中 - 在那里你需要重写一个名为drawRect:的方法 - 当你创建子类时,它甚至可能作为存根被添加进去了吗?

Cocoa在该视图绘制自己的时候调用这个方法。这意味着,当它被调用时,图形上下文将被设置,并且您所做的绘图代码将实际出现在屏幕上。

只需从drawRect:中调用您的drawpath方法即可看到您的线条。

一般点要记住的是,你不叫自己任何的绘制代码(除了drawRect:内 - 你要么标记视图需要显示([myView setNeedsDisplay:YES];,或者让系统本身

+0

谢谢!所以现在我的绘图工作除了数据不是从我的Document子类传递到我的自定义视图,直到它的init方法被调用之后。是否有另外一种方法我应该这样做?像initWithData这样的东西,但是对于View子类? – Priesto

+0

没有理由在初始化之后不能传入它,这样可以选择稍后更改数据。如果更新数据,请调用'setNeedsDisplay:',视图将会用新数据重新绘制自己。 – jrturton

+0

谢谢。我试过这个,但是现在我传递数据的方式有问题,但我想这是另一个问题。不要假设你可以告诉我为什么这不起作用:在NSDocument方法中: 'TemperatureGraph * current = [[TemperatureGraph alloc] init]; //查看类 NSUInteger a = [temps count]; // 35857 items [current setlog:temps]; ' 在TemperatureGraph中。m: ' - (void)setlog:(NSArray *)log { currentlog = log; [self setNeedsDisplay:YES]; }' 这会导致一个没有项目的数组? – Priesto