【问题标题】:Drag and drop files into NSOutlineView将文件拖放到 NSOutlineView
【发布时间】:2015-04-21 15:14:42
【问题描述】:

我正在尝试根据 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

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

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

【问题讨论】:

    标签: cocoa drag-and-drop nsoutlineview


    【解决方案1】:

    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 键路径? - 很遗憾,我无法为您提供帮助。


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

    【讨论】:

    • 仅异常断点建议就值得一票。有一个。 :-)
    猜你喜欢
    • 1970-01-01
    • 2010-10-13
    • 2012-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多