我在屏幕上有两个 NSTableView;我只想将一行从一个表拖到另一个表。我在这里和那里看到很多提示,但我没有看到完整的示例,我有点困惑。我看到了与 Apple示例应用程序TableView 游乐场和拖放 outlineView完全不同的示例。
我决定使用 Apples 方法,但现在我卡住了。TableView 游乐场在其模型对象中实现这些方法。
- (NSArray *)writableTypesForPasteboard:(NSPasteboard *)pasteboard
- (id)pasteboardPropertyListForType:(NSString *)type
- (NSPasteboardWritingOptions)writingOptionsForType:(NSString *)type pasteboard:(NSPasteboard *)pasteboard
我不明白如何设置这些。对于第一种方法,我返回了一个包含此问题@"com.mycompany.myapp.mypasteboardtype"
中建议的字符串的数组。
我应该为第二种方法添加什么?我的模型是一个自定义对象,它有许多字符串、数组和字典变量。我也不明白第三种方法。我希望有一些示例我可以看到使用自定义模型对象从一个表简单地拖动到另一个表。
编辑:我的实现基于以下响应
-(id)pasteboardPropertyListForType:(NSString *)type {
return [NSKeyedArchiver archivedDataWithRootObject:self];
}
-(NSArray *)writableTypesForPasteboard:(NSPasteboard *)pasteboard {
return [NSArray arrayWithObject:myDragType];
}
// Other methods that need to be implemented
-(id)initWithPasteboardPropertyList:(id)propertyList ofType:(NSString *)type {
return [NSKeyedUnarchiver unarchiveObjectWithData:propertyList];
}
+(NSArray *)readableTypesForPasteboard:(NSPasteboard *)pasteboard {
return [NSArray arrayWithObject:myDragType];
}
// And finally your object needs comply with NSCoder protocol. These following 2 methods needs to go in the object model associated with a row.
-(void)encodeWithCoder:(NSCoder *)aCoder {
[aCoder encodeObject:oneOfMyIvarsToEncode forKey:@"someKey"];
}
-(id)initWithCoder:(NSCoder *)aDecoder {
self = [super init];
if (self) {
oneOfMyEndodedIvars = [aDecoder decodeObjectForKey:@"someKey"];
}
return self;
}