2011-12-01 111 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