拖出 NSTableView 以移除
Posted
技术标签:
【中文标题】拖出 NSTableView 以移除【英文标题】:Dragging out of NSTableView to Remove 【发布时间】:2011-12-04 03:44:41 【问题描述】:我有一个NSTableView
,其中包含许多项目。我想实现从 inside 拖动并将 outside 拖放到 NSTableView 以删除拖动的项目。 (有点像 Safari 'poofs' 书签的方式。)
NSTableView
已配置为支持拖放重新排序,并接受来自应用程序中另一个 NSTableView
的拖放,因此虽然大部分已连接,但我只是缺少一小部分功能。
更新:
感谢 Sean 迄今为止的帮助。虽然我可以收到一个项目在浮动回到其原始位置后已被拖出的通知(请参阅对他的回答的评论),但我希望在释放鼠标按钮后立即收到通知。
当前的行为是用户将项目拖放出去,拖动被视为“无效”,并且项目以动画方式返回到其原始位置。 然后收到通知,我可以删除该项目,但从 UI 的角度来看,这有点令人困惑(对于用户而言)。
【问题讨论】:
【参考方案1】:听起来您的表格视图已经实现了NSDraggingSource
协议。在这种情况下,您可以添加方法draggedImage:endedAt:operation:
(OS 10.7 之前)或draggingSession:endedAtPoint:operation:
(OS 10.7),如果拖动失败,它将在operation
参数中提供操作NSDragOperationNone
。因此,您可以检查此操作是否通过,然后删除该对象并将其从视图中移除。
换句话说,它看起来像这样(在 10.7 中):
-(void)draggingSession:(NSDraggingSession *)session endedAtPoint:(NSPoint)screenPoint operation:(NSDragOperation)operation
if (operation == NSDragOperationNone)
//delete object, remove from view, etc.
【讨论】:
这些方法需要在 NSTableView 中定义,还是在充当委托/数据源的对象中定义?我不需要继承 NSTableView 来提供当前级别的拖动功能,只需实现一些委托方法并调用 registerForDraggedTypes:。实现您在数据源/委托中推荐的拖动方法似乎不起作用,但我会在 NSTableViews 的子类版本中尝试它们。 它通过将它们添加到子类 NSTableView 来工作,但问题是应用程序将拖动视为“坏”,并且图像浮动回到其原始位置,然后 调用上述方法。释放鼠标按钮时有什么方法可以立即收到通知? 我能够弄清楚最后一部分。在我的子类 NSTableView 中,我简单地覆盖:dragImage:at:offset:event:pasteboard:source:slideBack: 然后将该方法传递给 [super ...],同时将 slideBack: 参数更改为没有。 您应该将operation == NSDragOperationNone
与!NSPointInRect(screenPoint, self.view.window.frame)
结合起来,以避免在开始拖动之前将对象拖回其原始位置而被删除。【参考方案2】:
为避免拖拽图片飘回删除前的原始位置,可以在tableView:draggingSession:willBeginAtPoint:forRowIndexes:方法中设置拖拽会话属性“animatesToStartingPositionsOnCancelOrFail”:
- (void)tableView:(NSTableView *)tableView draggingSession:(NSDraggingSession *)session willBeginAtPoint:(NSPoint)screenPoint forRowIndexes:(NSIndexSet *)rowIndexes
[session setAnimatesToStartingPositionsOnCancelOrFail:NO];
但是我仍在寻找删除拖动行时创建“噗”的方法。
【讨论】:
不是方法,而是函数:NSShowAnimationEffect
感谢彼得。我现在正在使用这个: NSShowAnimationEffect(NSAnimationEffectPoof, [NSEvent mouseLocation], NSZeroSize, nil, nil, nil);
如何在这个方法中找出拖拽操作是什么?当你这样做时 [session setAnimatesToStartingPositionsOnCancelOrFail:NO];它总是不回去......但我只想要这个当我删除一行时......第二个问题是,当我拖动的项目超出我的应用程序窗口时,我只想删除该行......它应该是endAtPoint 可能,但我不知道怎么做?希望你能帮忙:)以上是关于拖出 NSTableView 以移除的主要内容,如果未能解决你的问题,请参考以下文章
在 recyclerview 中提交列表后强制编辑文本以移除焦点