【问题标题】:NSCollectionView in 10.6/Xcode 3.210.6/Xcode 3.2 中的 NSCollectionView
【发布时间】: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

我还将NSCollectionViewitemPrototype 绑定到我的NSCollectionViewItem(PersonController) 子类。

image showing bindings http://img503.imageshack.us/img503/4672/pic2d.png

现在PersonView.nibFile's OwnerNSCollectionViewitemPrototype 都指向我的子类。

image showing console output http://img340.imageshack.us/img340/6184/pic3.png

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

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

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

任何帮助将不胜感激。

【问题讨论】:

    标签: objective-c cocoa osx-snow-leopard nscollectionview copywithzone


    【解决方案1】:

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

    【讨论】:

    • 谢谢。它现在出现了,但我无法访问绑定到包含项目视图的笔尖的 FileOwner 的插座。我现在也必须这样做吗?
    • 我不确定你的意思。你能详细说明一下吗?
    • 您是否确保您的文件所有者和原型项目都被声明为您的子类的实例?如果原型项目仍然是 NSCollectionViewItem,那么复制的项目将属于同一类,而不是您的自定义类。 (我在尝试重现您所描述的内容时遇到了同样的问题。)
    • 是的,我都改了。有关详细信息,请参阅我的第二次更新。
    • 我真的不能说你接下来应该做什么。我已经复制了你的场景,并确保做我建议做的一切,它对我有用。给所有的东西第二遍,并确保你已经完成了所有的事情。也许尝试在调试器中中断 -[NSCollectionViewItem copyWithZone:],根除指向“self”的指针(我认为在 x86_64 上为 $esi,在 i386 上为 $ebp+8,并检查类。如果它仍然是 NSCollectionViewItem,你知道你错过了什么。
    【解决方案2】:

    要将representedObject 的属性与 IB 元素的值同步,您可能需要使用 Cocoa 绑定。在这种情况下,将 TextField 的值绑定到 File's OwnerModel Key Path 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 核心基础 0x977f658a __raiseError + 410 1 libobjc.A.dylib 0x9767ff49 objc_exception_throw + 56 2核心基础0x978429db-[NSObject(NSObject)不识别选择器:]+187 3 核心基础 0x9779e026 ___转发___ + 950 4 核心基础 0x9779dbf2 _CF_forwarding_prep_0 + 50 5 CoreFoundation 0x97789a5a -[NSObject(NSObject) 复制] + 42 6 AppKit 0x918ce1d7-[NSViewController 设置标题:] + 70 7 AppKit 0x91167dab-[NSNibOutletConnector 建立连接] + 406 ...

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多