Cocoa 将文件拖放到NSOutlineView中

Cocoa 将文件拖放到NSOutlineView中,cocoa,drag-and-drop,nsoutlineview,Cocoa,Drag And Drop,Nsoutlineview,我正试图根据苹果的例子在NSOutlineView中实现简单的拖放操作- 看起来一切正常,但最后当我从Finder中删除一些文件时,我得到了错误: [<ChildNode 0x60800005a280> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key description.') was raised during a dragging session [set

我正试图根据苹果的例子在NSOutlineView中实现简单的拖放操作-

看起来一切正常,但最后当我从Finder中删除一些文件时,我得到了错误:

[<ChildNode 0x60800005a280> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key description.') was raised during a dragging session
[setValue:forUndefinedKey:]:此类不符合密钥描述的键值编码。“)是在拖动会话期间引发的
以下是我的测试项目:

我在我的应用程序中真正需要的是:允许用户将多个文件和文件夹拖放到某个树列表中,然后将它们显示给用户。同时将所有这些内容保存到某个文件中,以便可以使用用户拖动的所有文件和文件夹再次加载

我想要的最终结果如下:


NSObject的
description
属性是只读的,通常通过在实现文件中提供getter来设置:

- (NSString *)description {
    return [self urlString]; // Using urlString solely for demo purposes.
}
您不能通过键值编码或直接赋值进行设置:

self.description = [self urlString]; // Xcode error: 'Assignment to readonly property'
[self setValue:[self urlString] forKey:@"description"];
-[ChildNode copyWithZone::
中,尝试执行这两种操作中的后一种,这就是导致将警告记录到控制台的原因

// -------------------------------------------------------------------------------
//  copyWithZone:zone
//   -------------------------------------------------------------------------------
- (id)copyWithZone:(NSZone *)zone
{
    id newNode = [[[self class] allocWithZone:zone] init];

    // One of the keys in mutableKeys is 'description'... 
    // ...but it's readonly! (it's defined in the NSObject protocol)
    for (NSString *key in [self mutableKeys])
    {
        [newNode setValue:[self valueForKey:key] forKey:key];
    }

    return newNode;
}
这就引出了一个问题:为什么你会在你的应用程序中得到警告,而不是在示例应用程序中?据我所知,示例应用程序中从未向任何
ChildNode
实例发送过
copyWithZone:
消息,而您的应用程序中确实会在删除后立即发送此消息。当然,这里还有第二个问题:为什么苹果公司在不能这样设置的情况下明确地包含
描述
关键路径不幸的是我帮不了你


试图捕获实际上不会导致异常的错误的一种非常方便的方法是添加一个All exceptions断点。如果您在示例应用程序中执行此操作,您将看到该应用程序在导致问题的线路上冻结,从而使您有更好的机会找出问题所在


单是异常断点建议就值得投票表决。有一个。:-)