将文件拖放到 NSOutlineView 中
Drag and drop files into 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
我的应用程序真正需要的是:允许用户将多个文件和文件夹拖放到某个树列表中,然后将它们显示给用户。还将所有这些保存到某个文件中,以便可以再次加载所有用户拖动的文件和文件夹。
我想要这样的最终结果:
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:
消息,而这确实发生在您的应用程序中,在放置后立即发生。当然这里还有第二个问题:为什么 Apple 在无法以这种方式设置时明确包含 description
键路径? - 很遗憾,我帮不了你。
尝试捕获实际上不会导致异常的错误的一种非常方便的方法是添加 All Exceptions 断点。如果您在示例应用程序中执行此操作,您会看到该应用程序在导致问题的行冻结,让您有更好的机会找出问题。
我正在尝试根据 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
我的应用程序真正需要的是:允许用户将多个文件和文件夹拖放到某个树列表中,然后将它们显示给用户。还将所有这些保存到某个文件中,以便可以再次加载所有用户拖动的文件和文件夹。
我想要这样的最终结果:
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:
消息,而这确实发生在您的应用程序中,在放置后立即发生。当然这里还有第二个问题:为什么 Apple 在无法以这种方式设置时明确包含 description
键路径? - 很遗憾,我帮不了你。
尝试捕获实际上不会导致异常的错误的一种非常方便的方法是添加 All Exceptions 断点。如果您在示例应用程序中执行此操作,您会看到该应用程序在导致问题的行冻结,让您有更好的机会找出问题。