在 NSTableView 中实现拖放

     2023-05-08     205

关键词:

【中文标题】在 NSTableView 中实现拖放【英文标题】:Implementing drag and drop in NSTableView 【发布时间】:2011-08-22 06:29:32 【问题描述】:

谁能帮我?我在下面使用了这段代码,但这些方法在执行期间没有被调用。

- (BOOL)tableView:(NSTableView *)tv writeRowsWithIndexes:(NSIndexSet *)rowIndexes toPasteboard:(NSPasteboard*)pboard

    // Copy the row numbers to the pasteboard.
    NSData *data = [NSKeyedArchiver archivedDataWithRootObject:rowIndexes];
    [pboard declareTypes:[NSArray arrayWithObject:@".gif"] owner:self];
    [pboard setData:data forType:@".gif"];
    return YES;


- (NSDragOperation)tableView:(NSTableView*)tv validateDrop:(id <NSDraggingInfo>)info proposedRow:(NSInteger)row proposedDropOperation:(NSTableViewDropOperation)op

    // Add code here to validate the drop

    if (row > [ m_imageArray count])
        return NSDragOperationNone;

    if (nil == [info draggingSource]) // From other application
    
        return NSDragOperationNone;
    
    else if (self == [info draggingSource]) // From self
    
        return NSDragOperationNone;
    
    else // From other documents 
    
        [tv setDropRow: row dropOperation: NSTableViewDropAbove];
        return NSDragOperationCopy;
    

    NSLog(@"validate Drop");
    return NSDragOperationCopy;



- (BOOL)tableView:(NSTableView *)aTableView acceptDrop:(id <NSDraggingInfo>)info
              row:(NSInteger)row dropOperation:(NSTableViewDropOperation)operation

    NSPasteboard* pboard = [info draggingPasteboard];
    NSData* rowData = [pboard dataForType:@".gif"];
    NSIndexSet* rowIndexes = [NSKeyedUnarchiver unarchiveObjectWithData:rowData];
    NSInteger dragRow = [rowIndexes firstIndex];

    // Move the specified row to its new location...

【问题讨论】:

【参考方案1】:

这是一个例子

#import "TableViewController.h"
#import "Person.h"

#define MyDataType @"MyDataType"

@implementation TableViewController 
    NSMutableArray *list;
    NSInteger sourceIndex;

@synthesize tableView;

-(void)awakeFromNib 
    [tableView registerForDraggedTypes:[NSArray arrayWithObjects:MyDataType, nil]];
    list = [[NSMutableArray alloc] init];
    Person *person = [[Person alloc] initWithName:@"Newton" age:64];
    [list addObject:person];
    person = [[Person alloc] initWithName:@"Archimedes" age:74];
    [list addObject:person];
    person = [[Person alloc] initWithName:@"Euler" age:44];
    [list addObject:person];
    person = [[Person alloc] initWithName:@"Poincare" age:24];
    [list addObject:person];
    person = [[Person alloc] initWithName:@"Gauss" age:34];
    [list addObject:person];


-(void)reArrange:(NSMutableArray *)array sourceNum:(NSInteger)sourceNum destNum:(NSInteger)destNum 
    Person *person = list[sourceNum];
    [list insertObject:person atIndex:destNum];

    if (sourceNum < destNum) 
        [list removeObjectAtIndex:sourceNum];
     else 
        [list removeObjectAtIndex:sourceNum+1];
    

    [tableView reloadData];



#pragma mark - Table

// how many rows are there in the table?
-(NSInteger)numberOfRowsInTableView:(NSTableView *)tv 
    return list.count;


// What object should I show in a particular cell?
-(id)tableView:(NSTableView *)tv objectValueForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row 
    Person *person = list[row];
    NSString *identifier = [tableColumn identifier];
    return [person valueForKey:identifier];


// Should I accept the drag with the rows specified by rowIndexes? If YES then place the data on the provided paste board.
- (BOOL)tableView:(NSTableView *)tv writeRowsWithIndexes:(NSIndexSet *)rowIndexes toPasteboard:(NSPasteboard *)pboard 
    NSData *data = [NSKeyedArchiver archivedDataWithRootObject:rowIndexes];
    [pboard declareTypes:[NSArray arrayWithObject:MyDataType] owner:self];
    [pboard setData:data forType:MyDataType];
    sourceIndex = [rowIndexes firstIndex];
    return YES;


// What kind of drag operation should I perform?
- (NSDragOperation)tableView:(NSTableView*)tv validateDrop:(id )info proposedRow:(NSInteger)row proposedDropOperation:(NSTableViewDropOperation)op 
    return op == NSTableViewDropAbove; // Specifies that the drop should occur above the specified row.


// The mouse button was released over a row in the table view, should I accept the drop?
- (BOOL)tableView:(NSTableView*)tv acceptDrop:(id )info row:(NSInteger)row dropOperation:(NSTableViewDropOperation)op 
    [self reArrange:list sourceNum:sourceIndex destNum:row]; // let the source array reflect the change
    return YES;


@end

【讨论】:

这是一个更全面的回复,感谢您的宝贵时间。【参考方案2】:

您需要为您的表格视图声明一个自定义拖动类型,然后使用您的自定义类型调用registerForDraggedTypes:。否则,正如您所注意到的,这些方法都不会被调用。

【讨论】:

您好,感谢您的建议。但我不知道如何声明自定义拖动类型【参考方案3】:

使用核心数据拖放 NSTableview

    为拖放注册表格视图对象:-

    [tblCategory registerForDraggedTypes:[NSArray arrayWithObject:@"public.text"]];
    

拖放委托方法:-

 - (id <NSPasteboardWriting>)tableView:(NSTableView *)tableView pasteboardWriterForRow:(NSInteger)row
 

 Category *category = (Category *)[self.arrCategoryList objectAtIndex:row];
 NSString *identifier = category.categoryname;

 NSPasteboardItem *pboardItem = [[NSPasteboardItem alloc] init];
 [pboardItem setString:identifier forType: @"public.text"];
 return pboardItem;
 

 - (NSDragOperation)tableView:(NSTableView *)tableView validateDrop:(id <NSDraggingInfo>)info proposedRow:(NSInteger)row proposedDropOperation:(NSTableViewDropOperation)dropOperation



if(dropOperation == NSTableViewDropOn)

NSPasteboard *p = [info draggingPasteboard];
NSString *title = [p stringForType:@"public.text"];
Category* category ;
NSInteger srcIndex;
for (srcIndex = 0; srcIndex < [_arrCategoryList count]; srcIndex++)

  category = [_arrCategoryList objectAtIndex:srcIndex];
if ([category.categoryname isEqualToString:title])

        break;

    category = nil;

if(!category)

     // Not found
     return NO;
 

 [_arrCategoryList removeObjectAtIndex:srcIndex];
 [_arrCategoryList insertObject:category atIndex:row];
 [tblCategory reloadData];
 return NSDragOperationMove;

  return NSDragOperationNone;


 - (BOOL)tableView:(NSTableView *)tableView acceptDrop:(id <NSDraggingInfo>)info row:(NSInteger)row dropOperation:(NSTableViewDropOperation)dropOperation
 
   return YES;

【讨论】:

【参考方案4】:

当我忘记将dataSource连接到IB中的NSTabeView时,我通常会观察到这种错误,即实现NSTableViewDataSource的tableView:writeRowsWithIndexes:toPasteboard:方法的类。

【讨论】:

【参考方案5】:

您可以为 NSMutableArray 或 NSMutableDictionary 或任何其他对象注册 draggedTypes。以下代码 sn-p 用于 NSMutableArray。

[tableView registerForDraggedTypes:[NSArray arrayWithObject:@"NSMutableArray"] ];

【讨论】:

【参考方案6】:

你需要在awakFromnib中声明一个registerForDraggedTypes方法

像这样。

[table_view registerForDraggedTypes:[NSArray arrayWithObjects:BasicTableViewDragAndDropDataType, nil]];

【讨论】:

【参考方案7】:

我不得不推荐这篇出色的 Red Sweater 博文

http://www.red-sweater.com/blog/274/a-moveable-beast

它提供了一个 NSArrayController 子类,它可以对表格项进行拖放重新排序,如果你想支持用你的对象拖到表格视图之外,我们刚刚写了一个简洁的补充那个班级:

http://www.rwe-uk.com/blog/comments/nstableview_drag_and_drop_with_bindings_and_nsarraycontroller

它建立在原始帖子的基础上

【讨论】:

链接损坏“站点错误:无法加载站点首选项;未找到首选项”

如何在 cypress 测试中实现拖放?

】如何在cypress测试中实现拖放?【英文标题】:Howtoimplementdraganddropincypresstest?【发布时间】:2019-08-1702:14:13【问题描述】:我正在努力使用Cypress和AngularMaterialDragandDrop测试拖放。因此,目标是将“开始工作”从待办事项转移到... 查看详情

Java 7:如何在 Java 中实现拖放?

】Java7:如何在Java中实现拖放?【英文标题】:Java7:Howtoimplementdrag&dropinJava?【发布时间】:2013-04-2515:06:25【问题描述】:我目前正在使用Java7Update21进行拖放试验。我的目标操作系统是:Windows7Ubuntu12.04MacOSX10.6/10.8要求是:将文... 查看详情

有没有办法在 phonegap angular js 项目中实现拖放?

】有没有办法在phonegapangularjs项目中实现拖放?【英文标题】:Isthereawaytoimplementdrag&dropinaphonegapangularjsproject?【发布时间】:2014-12-0116:27:04【问题描述】:我试过这个:https://github.com/codef0rmer/angular-dragdrop和touchpunch(http://touchpunc... 查看详情

在 Avalonia 中实现 TreeView 节点的拖放

】在Avalonia中实现TreeView节点的拖放【英文标题】:ImplementingdraganddropforTreeViewnodesinAvalonia【发布时间】:2017-11-1013:03:56【问题描述】:如何在TreeView控件中实现拖放行为?一个例子是文件浏览器,用户可以通过拖动将文件从一个... 查看详情

如何在图像上实现拖放,改变其位置

】如何在图像上实现拖放,改变其位置【英文标题】:Howtoimplementdrag&Droponanimage,changingitsposition【发布时间】:2020-06-0119:58:09【问题描述】:我开发了一个滑块,向我展示了几张图片。在顶部(大图像和滑块所在的位置)我将... 查看详情

在 NSTableView 上拖放重新排序行

】在NSTableView上拖放重新排序行【英文标题】:Drag&DropReorderRowsonNSTableView【发布时间】:2011-01-0811:28:54【问题描述】:我只是想知道是否有一种简单的方法可以设置NSTableView以允许它重新排序其行而无需编写任何粘贴板代码。... 查看详情

Recyclerview 拖放 ontouch

...600:18:10【问题描述】:我已经使用ItemTouchHelper在recyclerview中实现拖放。它工作正常。但它只适用于长按。我需要用onTouch来做这件事ItemTouchHelper.CallbackitemTouchHelperCallback=newItemTouc 查看详情

在拖放期间在 NSTableView 中打开一个间隙

】在拖放期间在NSTableView中打开一个间隙【英文标题】:OpeningagapinNSTableViewduringdraganddrop【发布时间】:2012-04-2522:14:10【问题描述】:我有一个简单的、单列、基于视图的NSTableView,其中包含可以拖动以重新排序的项目。在拖放过... 查看详情

在 UITextView 中拖放时显示文本光标

...布时间】:2018-05-0104:01:42【问题描述】:我正在我的应用中实现拖放。将应用拖放(主要是拖放)的主要屏幕之一是UITextView。我已使用以下代码向此UITextView添加了放置交互:letdropInteraction=UIDropInteraction(delegate:se 查看详情

如何在unity中实现拖尾效果

在制作游戏过程中会出现鼠标滑动的实现,而为啦增强视觉效果,往往会添加拖尾或者鼠标点击的特效,接下来就说说在unity中如何实现拖尾效果,首先unity中有个组件,叫TrailRenderer,在Component——>Effect——>TrailR... 查看详情

html5中的拖放

(1)在HTML5中实现拖放需要将目标元素的"draggable"属性设置为"true";(2)元素拖放时触发的相关事件: a:dragstart——在开始拖放被拖放元素时触发(事件主体:被拖放元素);b:drag——正在拖放被拖放元素触发(事件主体... 查看详情

如何在vue中实现拖拽(代码片段)

1、npmi vuedraggable2、在组件中引入importvuedraggablefrom'vuedraggable';3、<template><vuedraggableclass="wrapper"v-model="list"><transition-group><divv-for& 查看详情

拖放 - vb.net

...】:2011-09-1214:34:14【问题描述】:我正在Windows应用程序中实现拖放。我有主窗体(具有搜索、打开、打印等工具栏)-MdiContainer搜索时-打开一个子项-搜索表单。将文件拖放到此搜索表单上的网格中。在Grid的DragDrop事件中-调用模... 查看详情

用于 Silverlight 中拖放的 TranslateTransform

...2011-01-3012:05:07【问题描述】:我们正在尝试在Silverlight(3)中实现拖放。我们希望用户能够将元素从树视图拖到UI的另一部分。父元素是一个Grid,我们一直在尝试使用TranslateTransform以及MouseLef 查看详情

拖放异步数据获取

...301:02:40【问题描述】:我正在尝试在共享图像的应用程序中实现拖放。我所有的图像都是高性能缩略图(即小尺寸),所以我不能将它们用作我的UIDragItem,至少不能用作最终图像。我正在寻找一种为我的原始图像提供URL并将其... 查看详情

从 UWP 应用异步拖放(和拖放)

...:2019-06-2418:05:24【问题描述】:我正在尝试在我的UWP应用中实现拖放机制,以便可以轻松地将我的应用中的项目复制到其他应用中。问题是,在拖动操作开始的那一刻,我并不总是拥有应该复制的数据。相反,我等待异步操作完... 查看详情

使用核心数据存储对 NSTableView 的拖放支持

】使用核心数据存储对NSTableView的拖放支持【英文标题】:Drag\'n\'DropSupportforNSTableViewwithCoreDataStorage【发布时间】:2010-11-2520:43:35【问题描述】:我必须在我的应用程序中的NSTableViews都显示存储为“CoreData”的数据。TableViews是非... 查看详情

NSTableView 并从 Finder 拖放

】NSTableView并从Finder拖放【英文标题】:NSTableViewanddraganddropfromFinder【发布时间】:2012-05-0516:27:29【问题描述】:我正在尝试将Finder拖放到我的应用程序的NSTableView中。该设置使用NSTableView,这是一个数组控制器,它使用Cocoa绑定... 查看详情