我有NSTableView
,其中包含许多项目。我想实现从里面的拖放并删除NSTableView的外部来删除拖动的项目。 (有点像Safari'poofs'的书签。)
NSTableView
已配置为支持拖放重新排序,并接受来自应用程序中另一个NSTableView
的丢弃,因此虽然其中大部分已连线,但我只是错过了一个小的功能性。
更新
感谢 Sean 到目前为止他的帮助。虽然我可以收到一个项目在其已经浮动回到其原始位置后被拖出的通知(请参阅对他的回答的评论),但我希望在释放鼠标按钮后立即收到通知。
当前行为是用户将项目拖放出来,将拖动视为“无效”,并使项目动画回原始位置。 然后收到通知,我可以删除该项目,但从UI的角度来看,这对于用户来说有点混乱。
答案 0 :(得分:9)
听起来你的表视图已经在实现NSDraggingSource
协议。在这种情况下,您可以添加方法draggedImage:endedAt:operation:
(OS 10.7之前的版本)或draggingSession:endedAtPoint:operation:
(OS 10.7),如果拖动失败,它将在NSDragOperationNone
参数中提供操作operation
。因此,您可以检查是否已通过此操作,然后删除该对象并将其从视图中删除。
换句话说,它看起来像这样(在10.7中):
-(void)draggingSession:(NSDraggingSession *)session endedAtPoint:(NSPoint)screenPoint operation:(NSDragOperation)operation {
if (operation == NSDragOperationNone) {
//delete object, remove from view, etc.
}
}
答案 1 :(得分:4)
为了避免拖动图像在删除之前浮动回原始位置,可以在tableView中设置拖动会话属性“animatesToStartingPositionsOnCancelOrFail”:draggingSession:willBeginAtPoint:forRowIndexes:method:
- (void)tableView:(NSTableView *)tableView draggingSession:(NSDraggingSession *)session willBeginAtPoint:(NSPoint)screenPoint forRowIndexes:(NSIndexSet *)rowIndexes {
[session setAnimatesToStartingPositionsOnCancelOrFail:NO];
}
但是我仍在搜索删除拖动行时创建“poof”的方法。