2011-06-09 71 views
2

當談到可可編程時,我是一個相當新手,所以我希望有些專家可以提示我正確的方向與我面臨的問題。問題與NSCollectionView

我有一個NSCollectionView綁定到NSArrayController(A)的元素有兩個屬性:一個圖片的URL和另一個類的元素的NSArray(B)。 對於NSArrayController(A)中的每個元素,我加載一個帶有NSImageView的子視圖,該視圖應該在URL中顯示圖像並綁定到NSArray(B)元素的NSTableView。

一切工作正常,除了一個非常重要的事情:當我創建子視圖時,圖片的URL不是立即可用,它稍後可用,但是當它時,我看不到圖片加載NSImageView。 我會想到KVC/KVO實現中的一個問題,但奇怪的是,如果URL可用時子視圖不可見(例如,在未顯示的部分滾動視圖中) 。

示例:NSScrollview大小一次只能顯示兩個子視圖。我向NSArrayController(A)添加了三個元素:前兩個圖像不加載,如果向下滾動scrollview以查看第三個元素,則會發現圖像加載正確。

任何關於什麼可能會導致這樣一個奇怪的行爲的想法? 預先感謝您

盧卡

series.h

@interface Series : NSObject { 
@private 
NSMutableString * banner; 
} 
-(Series*)initWithEpisode:(Episode*)ep; 
-(void)setBanner:(NSString*)_banner; 
@property (retain, readwrite) NSMutableString *banner; 
@end 

series.m

@implementation Series 
@synthesize banner; 
-(Series*)initWithEpisode:(Episode*)ep 
{ 
self = [super init]; 
if(self){ 
banner = [[NSMutableString alloc]initWithString:@"some invalid URL"]; 
} 
-(void) setBanner:(NSString*)_banner 
{ 
[banner setString:[NSString stringWithFormat:@"some root path/%@", _banner]; 
} 
-(void)dealloc 
{ 
[super dealloc]; 
[banner release]; 
} 

SeriesListViewController.m

-(void)VideoChangedStatus:(Episode*)ep{ 
//This is the delegate called by the object Episode when it retrieves the URL via asynchronous call to a webservice 
Series *tmp = [[Series alloc]initWithEpisode:ep]; 
[[seriesList objectAtIndex:[seriesList indexOfObject:tmp]]setBanner:[ep banner]]; 
} 

在子視圖筆尖文件完成後,到NSImageView結合:我設置類型NSCollectionViewItem的文件擁有者,然後綁定Valueurl到representedObject.banner 我沒有繼承NSCollectionView也不NSCollectionViewItem

+0

描述你如何「載入圖像」。當URL可用時究竟發生了什麼?你如何更新你的模型(KVO-通知財產)?你如何更新你的視圖(綁定?)。 – 2011-06-09 14:15:25

+0

感謝您的回覆! NSImageView的urlvalue屬性綁定到名爲「banner」的NSMutableString。當URL變爲可用時,通過名爲setBanner的方法將標題值更改爲新的URL – Luca 2011-06-09 14:55:37

+0

信息不足。爲了清晰起見,描述綁定*完全* - 每個方面。 *完全描述「banner」屬性*(它是帶有@synthesize訪問器或自定義訪問器的Objective-C 2.0 @property?該屬性屬於哪個對象?該對象是存儲在數組控制器還是其他位置?)。幫助我們幫助你。 – 2011-06-09 15:05:53

回答

1

天后嘗試我發現,有效的解決方案:顯然這是不夠的,使用了setString方法,我需要的財產重新intialize的setBanner方法內

-(void) setBanner:(NSString*)_banner 
{ 
    banner = [NSMutableString[NSString stringWithFormat:@"some root path/%@", _banner]]; 
} 

不過,我會很高興地知道,如果有人有一個解釋爲什麼setString導致這種奇怪的(對我)問題以及爲什麼這個解決方案有效。

謝謝 盧卡

0

我不知道爲什麼你聲明banner是一個可變的字符串 - 它看起來像一個不可改變的字符串就足夠了。

無論如何,當你寫一個自定義的setter方法需要發送-willChangeValueForKey:-didChangeValueForKey:確保志願(因此綁定)合規性:

-(void) setBanner:(NSString*)_banner 
{ 
    [self willChangeValueForKey:@"banner"]; 
    [banner setString:[NSString stringWithFormat:@"some root path/%@", _banner]; 
    [self didChangeValueForKey:@"banner"]; 

} 
+0

我也試過,但它沒有任何好處。 – Luca 2011-06-10 07:39:19