cocoa - 将文件拖放到 NSOutlineView 中

标签 cocoa drag-and-drop nsoutlineview

我正在尝试基于Apple的示例在 NSOutlineView 中实现简单的拖放操作 - https://developer.apple.com/library/mac/samplecode/SourceView/Introduction/Intro.html

一切似乎都没问题,但最后当我从 Finder 中删除一些文件时,出现错误:

[<ChildNode 0x60800005a280> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key description.') was raised during a dragging session

这是我的测试项目:https://www.dropbox.com/s/1mgcg2dysvs292u/SimpleDrag.zip?dl=0

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

我想要的最终结果是这样的:

enter image description here

最佳答案

NSObjectdescription 属性是只读的,通常通过在实现文件中提供 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: 消息,而这种情况确实发生在您的应用程序中,在放置后立即发生。当然,这里还有第二个问题:为什么 Apple 无法以这种方式设置时要显式包含 description 键路径? - 不幸的是我无法帮助你。


try catch 实际上不会导致异常的错误的一个非常方便的方法是添加一个所有异常断点。如果您在示例应用程序中执行此操作,您将看到应用程序在导致问题的行处卡住,从而使您有更好的机会找出问题。

enter image description here

关于cocoa - 将文件拖放到 NSOutlineView 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29776323/

相关文章:

javascript - onDargStart 事件监听器在 react 中输出空值

cocoa - 如何将 NSOutlineView 的最后一个树项保留在侧边栏的最底部?

objective-c - NSOutlineView 子类中内容更改时的通知

cocoa - 无法更改桌面图像,因为 url 不是文件 url

cocoa - 如何在整个应用程序中禁用文本字段自动更正?

java - 如何使用 Selenium WebDriver Java 自动化拖放功能

javascript - html5拖放 - 拖动文本的单个字符 - 可以看到光标中的字符与图像一起使用吗?

cocoa - 如何从 CGFont 或 CTFont 对象获取 NSFont 对象?

objective-c - 制作一个圆形的 NSSlide 外观和行为就像在 GarageBand 中一样

cocoa - NSScrollView 边缘插入