3

NSCollectionViewItem在 Xcode 3.1.2 中,我曾经在我的子类中加载 nib,NSCollectionViewItem如下所示:

-(id)copyWithZone:(NSZone *)zone
{   
    id result = [super copyWithZone:zone];

    [NSBundle loadNibNamed:@"PersonView" owner:result];

    return result;
}

在 10.6 下的 Xcode 3.2 中,相同的方法不会产生错误,但也不会在NSCollectionView其中加载视图。

是否需要做其他事情才能使视图显示出来?或者有没有更好的方法来改变NSCollectionItem's superclass to NSViewController

毕竟,重写copyWithZone来实现这个标准功能对我来说似乎总是一种 hack。我认为应该能够指定应该在 IB 中使用的 nib,但 Apple 似乎不这么认为。

我确实查看了文档中提供的示例,但是NSCollectionViewItem使用 以编程方式对其进行了实例化initWithNibName,但我想在 IB 中创建它。

更新

我按照 kperryua 的建议做了,但现在我无法从NSCollectionViewItem. 这是我正在尝试做的事情:

- (void)setRepresentedObject:(id)object {

    if (object) {
        [labelName setValue:[object name]];
    }
}

我将标签名称绑定到文件所有者,即我的NSCollectionViewItem. 这曾经在 10.5 中完美运行,但现在未分配插座(我使用 GDB 进行了检查)。

图片显示绑定 http://img21.imageshack.us/img21/671/picya.png

更新 2

我还将NSCollectionView's绑定itemPrototype到我的NSCollectionViewItem(PersonController) 子类。

图片显示绑定 http://img503.imageshack.us/img503/4672/pic2d.png

现在File's OwnerthePersonView.nibitemPrototypeof 都NSCollectionView指向我的子类。

显示控制台输出的图像 http://img340.imageshack.us/img340/6184/pic3.png

正如您在屏幕截图中看到的那样,项目已显示,但标签的文本无法更改,因为labelName无法访问插座。

我还记录了我尝试设置的名称,以确保它不是“名称”。

需要做什么来更改标签的值?

任何帮助,将不胜感激。

4

2 回答 2

4

是的,Snow Leopard 让这变得容易多了。在 IB 中,单击 NSCollectionViewItem 并设置 nib 名称和包名称(对于主包,只需将其留空)。在您的 PersonView 笔尖中,将 NSCollectionViewItem 设为文件的所有者,并将 -view 插座连接到该笔尖中的视图。(看起来你可能已经在那个笔尖中进行了这样的设置。)其他一切都应该是自动的,并且覆盖 copyWithZone: 不应该是必要的。

于 2009-09-27T20:35:50.453 回答
0

要将 IB 元素的属性与 IB 元素的值同步representedObject,您可能需要使用 Cocoa-bindings。在这种情况下,将 TextField 的值绑定到文件所有者的模型路径。 representedObject.name

我使用 10.6 Xcode 3.2但是您所做的却无法发挥作用:将 IB 元素连接到我的 CollectionViewItem 的 Outlet。我有一个 CollectionViewItem 的自定义子类,一切都按照你的方式设置。但是在运行应用程序时它失败了

[NSTextField copyWithZone:]:无法识别的选择器发送到实例 0x210a60 2009-10-19 13:05:18.772 WrapperTest[24122:a0f] 引发未捕获的异常 2009-10-19 13:05:18.774 WrapperTest[24122:a0f] - [NSTextField copyWithZone:]:无法识别的选择器发送到实例 0x210a60 2009-10-19 13:05:18.779 WrapperTest[24122:a0f] *** 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:'-[NSTextField copyWithZone:] :无法识别的选择器发送到实例 0x210a60' *** 第一次抛出调用堆栈:( 0 CoreFoundation 0x977f658a __raiseError + 410 1 libobjc.A.dylib 0x9767ff49 objc_exception_throw + 56 2 CoreFoundation 0x978429db -[NSObject(NSObject) doesNotRecognizeSelector:] + 187 3 CoreFoundation 0x9779e026 ___forwarding___ + 950 4 CoreFoundation 0x9779dbf2 _CF_forwarding_prep_0 + 50 5 CoreFoundation 0x97789a5a -[NSObject(NSObject) copy] + 42 6 AppKit 0x918ce1d7 -[NSViewController setTitle:] + 70 7 AppKit 0x91167dab -[NSNibOutletConnector establishConnection] + 406 . ..] + 70 7 AppKit 0x91167dab -[NSNibOutletConnector 建立连接] + 406 ...] + 70 7 AppKit 0x91167dab -[NSNibOutletConnector 建立连接] + 406 ...

我不确定为什么那些NSTextFields缺少他们的copyWithZone,因为他们应该实施它

我修复了这个问题,我不知道,我需要将这些 Outlets 声明为视图的属性,包括绑定在内的所有内容似乎都有效。

于 2009-10-19T11:25:05.817 回答