在Cocoa编程方面,我是个新手,所以我希望一些专家能用我所面临的问题来暗示我的正确方向。
我有一个NSCollectionView,它绑定到具有两个属性的元素的NSArrayController (A):一个图片的URL和另一个类的元素的NSArray (B)。对于NSArrayController (A)中的每个元素,我加载一个带有NSImageView的子视图,该视图应该在URL中显示图像,并加载一个绑定到NSArray (B)元素的NSTableView。
一切都很好,除了一件非常重要的事情:当我创建子视图时,图片的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;
@endseries.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绑定到我没有子类NSCollectionView或NSCollectionViewItem的representedObject.banner
发布于 2011-06-10 06:21:54
经过几天的尝试,我找到了一个可行的解决方案:显然,仅仅使用setString方法是不够的,我需要对setBanner方法中的属性进行再分类。
-(void) setBanner:(NSString*)_banner
{
banner = [NSMutableString[NSString stringWithFormat:@"some root path/%@", _banner]];
} 尽管如此,我还是很高兴知道是否有人解释了为什么setString会导致这个奇怪的(对我来说)问题,以及为什么这个解决方案有效。
谢谢卢卡
发布于 2011-06-10 06:42:15
我不知道为什么您将banner声明为一个可变字符串--看起来一个不可变的字符串就足够了。
无论如何,当您编写自定义setter方法时,您需要发送-willChangeValueForKey:和-didChangeValueForKey:来确保KVO (因此是绑定)的遵从性:
-(void) setBanner:(NSString*)_banner
{
[self willChangeValueForKey:@"banner"];
[banner setString:[NSString stringWithFormat:@"some root path/%@", _banner];
[self didChangeValueForKey:@"banner"];
}https://stackoverflow.com/questions/6292707
复制相似问题