想象一下这个人口稀少的NSMatrix
五列彩色列(0-4),最近添加的列为橙色。这些填充了标有(x,y)坐标的替代对象(随机数)。 "空白"单元格具有替代NULL对象。这有点工作。
我有四个数据"来源"顶部的(A-D)我想要拖拽到矩阵上。它们标有表示目标行(0-3)的数字。 即使我认为我已正确完成NSDragSource
,我也无法阻止这些。
示例行为:
如果我将单元格B(带有0,2)拖到"中心"列(4,y)的区域,其内容将与两个空单元(行0和2)合并。如果我拖到列的左侧或右侧区域,我将得到一个前置或附加列 - 在这种情况下,是一个稀疏列。
如果我将单元格A(带有0,1,2,3)拖到任何单元格上,它将创建一个新列。
如果我将单元格D拖到列(0,y)或(4,y)上,它将合并;在其他地方拖动它将创建新的稀疏列。使用C在任何地方执行此操作将创建新的稀疏列。
正如人们可以推测的那样,这种复杂的合并行为使我在这里而不是NSTableView
。
我没有太多问题需要识别左/中/右区域或合并数据或创建新列 - 我需要帮助创建正确的NSPasteboard
互动和/或NSDragging
设置(我最终希望在Core Data中使用自定义NSManagedObject
来识别哪些行已填充,但我从这里开始。)
NSStringPboardType
的{{1}}原型化。没有骰子。 NSTextFields
接收字符串(或NSMatrix
)。没问题。一旦我收到相应的传入单元格(字符串),我就可以浏览它并找出是否与当前列合并,或者创建一个新列 - 再次,这不是问题。
我做过的事情......
1)Subclassed NSTextField ...
NSFilenamesPboardType
2)注册了文本字段'拖动类型和尝试拖动会话......
@interface CellStringView : NSTextField <NSDraggingSource>
我的- (void)awakeFromNib {
[self registerForDraggedTypes:@[NSStringPboardType]];
}
- (NSDragOperation)draggingSession:(NSDraggingSession *)session
sourceOperationMaskForDraggingContext:(NSDraggingContext)context {
if (context == NSDraggingContextWithinApplication) {
return NSDragOperationCopy;
}
else
return NSDragOperationNone;
}
-(void)dealloc {
[self unregisterDraggedTypes];
}
方法永远不会被调用。
我对这个draggingSession:sourceOperationMaskForDraggingContext:
内容感到陌生,所以任何帮助都会受到赞赏。