NSCollectionView的问题

时间:2011-06-09 12:22:40

标签: objective-c cocoa

对于Cocoa编程我是一个相当新秀,所以我希望有些专家能够在我正面临的问题上向我提出正确的方向。

我有一个NSCollectionView绑定到具有两个属性的元素的NSArrayController(A):图片的URL和另一个类的元素的NSArray(B)。 对于NSArrayController(A)中的每个元素,我加载一个带有NSImageView的子视图,它应该在URL中显示图像,并且NSTableView绑定到NSArray(B)的元素。

一切正常,除了一个非常重要的事情:当我创建子视图时,图片的URL不会立即可用,它稍后可用,但是当它出现时,我看不到NSImageView中的图片加载。 我会想到KVC / KVO实现中的问题,但奇怪的是,当URL变得可用时,如果子视图不可见(例如,在未显示的滚动视图的一部分中),则图像正确加载。

示例:NSScrollview大小使得它一次只能显示两个子视图。我向NSArrayController(A)添加了三个元素:前两个图像不加载,如果我向下滚动滚动视图以查看第三个元素,我发现图像加载正确。

关于什么可能导致这种奇怪行为的任何想法? 提前谢谢

卢卡

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]];
}

绑定在子视图nib文件中完成,到NSImageView:我设置文件的所有者类型为NSCollectionViewItem,然后将Valueurl绑定到representObject.banner 我没有子类NSCollectionView和NSCollectionViewItem

2 个答案:

答案 0 :(得分:1)

经过几天的尝试后,我找到了一个有效的解决方案:显然使用setString方法是不够的,我需要重新初始化setBanner方法中的属性

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

仍然,我很高兴知道是否有人解释为什么setString导致了这个奇怪的(对我而言)问题以及为什么这个解决方案有效。

谢谢 卢卡

答案 1 :(得分:0)

我不确定为什么你声明banner是一个可变的字符串 - 它看起来像一个不可变的字符串就足够了。

无论如何,当您编写自定义setter方法时,您需要发送-willChangeValueForKey:-didChangeValueForKey:以确保符合KVO(以及绑定):

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

}