【发布时间】:2009-09-27 19:36:20
【问题描述】:
在 Xcode 3.1.2 中,我曾经在 NSCollectionViewItem 的子类中加载 NSCollectionViewItem 的笔尖,如下所示:
-(id)copyWithZone:(NSZone *)zone
{
id result = [super copyWithZone:zone];
[NSBundle loadNibNamed:@"PersonView" owner:result];
return result;
}
在 10.6 以下的 Xcode 3.2 中,相同的方法不会产生错误,但也不会加载 NSCollectionView 中的视图。
是否需要执行其他操作才能显示视图?
或者,将NSCollectionItem 的超类更改为NSViewController,是否有更好的方法?
毕竟,重写copyWithZone 来实现这个标准功能对我来说似乎总是一种技巧。我认为应该能够指定应该在 IB 中使用的 nib,但似乎 Apple 不这么认为。
我确实查看了文档中提供的示例,但NSCollectionViewItem 是使用initWithNibName 以编程方式实例化的,但我想在 IB 中创建它。
更新:
我按照 kperryua 的建议做了,但现在我无法从 NSCollectionViewItem 访问网点。这是我正在尝试做的事情:
- (void)setRepresentedObject:(id)object {
if (object) {
[labelName setValue:[object name]];
}
}
我将标签名称绑定到文件所有者,即我的NSCollectionViewItem。过去在 10.5 中可以完美运行,但现在未分配插座(我使用 GDB 进行了检查)。
image showing the bindings http://img21.imageshack.us/img21/671/picya.png
更新 2:
我还将NSCollectionView 的itemPrototype 绑定到我的NSCollectionViewItem(PersonController) 子类。
image showing bindings http://img503.imageshack.us/img503/4672/pic2d.png
现在PersonView.nib 的File's Owner 和NSCollectionView 的itemPrototype 都指向我的子类。
image showing console output http://img340.imageshack.us/img340/6184/pic3.png
正如您在屏幕截图中看到的那样,项目已显示,但标签的文本无法更改,因为插座 labelName 无法访问。
我还记录了我尝试设置的名称,以确保它不是“名称”。
更改标签的值需要做什么?
任何帮助将不胜感激。
【问题讨论】:
标签: objective-c cocoa osx-snow-leopard nscollectionview copywithzone