首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSCollectionView问题

NSCollectionView问题
EN

Stack Overflow用户
提问于 2011-06-09 12:22:39
回答 2查看 818关注 0票数 2

在Cocoa编程方面,我是个新手,所以我希望一些专家能用我所面临的问题来暗示我的正确方向。

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

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

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

对于什么会导致这种奇怪的行为,有什么想法吗?提前谢谢你

卢卡

series.h

代码语言:javascript
复制
@interface Series : NSObject {
@private
NSMutableString * banner;
}
-(Series*)initWithEpisode:(Episode*)ep;
-(void)setBanner:(NSString*)_banner;
@property (retain, readwrite) NSMutableString *banner;
@end

series.m

代码语言:javascript
复制
@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

代码语言:javascript
复制
-(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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-06-10 06:21:54

经过几天的尝试,我找到了一个可行的解决方案:显然,仅仅使用setString方法是不够的,我需要对setBanner方法中的属性进行再分类。

代码语言:javascript
复制
-(void) setBanner:(NSString*)_banner  
 {
     banner = [NSMutableString[NSString stringWithFormat:@"some root path/%@", _banner]];  
 }  

尽管如此,我还是很高兴知道是否有人解释了为什么setString会导致这个奇怪的(对我来说)问题,以及为什么这个解决方案有效。

谢谢卢卡

票数 1
EN

Stack Overflow用户

发布于 2011-06-10 06:42:15

我不知道为什么您将banner声明为一个可变字符串--看起来一个不可变的字符串就足够了。

无论如何,当您编写自定义setter方法时,您需要发送-willChangeValueForKey:-didChangeValueForKey:来确保KVO (因此是绑定)的遵从性:

代码语言:javascript
复制
-(void) setBanner:(NSString*)_banner
{
    [self willChangeValueForKey:@"banner"];
    [banner setString:[NSString stringWithFormat:@"some root path/%@", _banner];
    [self didChangeValueForKey:@"banner"];

}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6292707

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档