2012-12-16 37 views
0

我有一系列想要在應用程序中使用的圖像。我想要做的就是將它們存儲在NSArray中,以便在drawRect:函數中輕鬆識別。這是一個實現NSImages數組的適當方式嗎?

我已經創建了一個.plist文件,該文件詳細描述了一個NSDictionary,其中的鍵只是整數值的遞增值,以及與圖像文件名相對應的值。這允許我遍歷字典並將一系列NSImage對象添加到數組中。我在這裏使用for循環,因爲順序很重要,快速枚舉並不能保證從字典中讀取時的執行順序!

目前我做了以下內容:(這是一個NSView的子類)

@property (strong) NSDictionary *imageNamesDict; 
@property (strong) NSMutableArray *imageArray; 
... 

// in init method: 

    _imageNamesDict = [[NSDictionary alloc] initWithContentsOfFile:@"imageNames.plist"]; 

    _imageArray = [[NSMutableArray alloc] initWithCapacity:[_imageNamesDict count]]; 

    for (int i=0; i<_imageNamesDict.count; i++) { 
     NSString *key = [NSString stringWithFormat:@"%d", i]; 
     [_imageArray addObject:[NSImage imageNamed:[_imageNamesDict objectForKey:key]]; 
    } 

// When I want to draw a particular image in drawRect: 

    int imageToDraw = 1; 

    // Get a pointer to the necessary image: 
    NSImage *theImage = [_imageArray objectAtIndex:imageToDraw]; 

    // Draw the image 
    NSRect theRect = NSMakeRect (100,100, 0, 0); 
    [theImage drawInRect:theRect fromRect:NSZeroRect operation:NSCompositeCopy fraction:1.0]; 

這一切似乎正常工作,但有一個怪癖。我注意到在繪製顯示畫面時會出現少量滯後,但只有在第一次繪製新圖像時纔會發生。一旦每個圖像至少出現一次,我就可以重新繪製任何想要的圖像,而不會有任何延遲。

難道我沒有正確加載圖像,或者有什麼方法可以在創建要添加到for循環的對象時預先緩存每個圖像?

謝謝!

+2

這甚至不會運行,因爲您已經定義_imageArray爲一個NSMutableDictionary而不是一個NSMutableArray。 – rdelmar

+1

詞典不是有序的關係。與其試圖通過使用表示索引的數字的字符串強制使用鍵,爲什麼不使用數組呢? –

+0

哎呀,這是一個錯字!對不起,我將編輯帖子來糾正這個!這是一個很好的觀點,我不知道我的邏輯是在哪裏使用NSDictionary,而不是數組來自於思考它!使用數組也會使管理plist變得更簡單! – tom1990

回答

2

假設您已經克服了註釋中指出的「... NSMutableDictionary而不是NSMutableArray ...」問題,您正在正確加載圖像。

你所描述的滯後是因爲[NSImage imageNamed: ]沒有做所有繪製圖像所需的工作,使得你的第一個平局發生。

你也許可以得到由繪製圖像到屏幕外的緩衝區,你將它們添加到您的陣列擺脫滯後的,是這樣的:

// Create an offscreen buffer to draw in. 
newImage = [[NSImage alloc] initWithSize:imageRect.size]; 
[newImage lockFocus]; 

for (int i=0; i<_imageNamesDict.count; i++) { 
    NSString *key = [NSString stringWithFormat:@"%d", i]; 
    NSImage *theImage = [NSImage imageNamed:[_imageNamesDict objectForKey:key]]; 
    [_imageArray addObject: theImage]; 
    [theImage drawInRect:imageRect fromRect:NSZeroRect operation:NSCompositeCopy fraction:1.0]; 
} 
[newImage unlockFocus]; 
[newImage release]; 
+0

謝謝你的回答,我沒有意識到是這樣的!這工作正常,並防止我遇到的滯後。根據上面的評論,我將改變imageNames爲NSArray,而這也將允許我使用快速枚舉實現加載循環。 – tom1990

相關問題