将字符串数据从My Cocoa App拖到第三方Cocoa App

时间:2010-12-22 16:32:21

标签: cocoa drag-and-drop clipboard pasteboard

我想从我的tableview中拖出一行并将其放入Mac OS X 10.6中的任何其他NSTextField中,并删除一串文本。

拖放已在我的应用程序中运行(在NSTableView和NSBrowser之间),但我没有成功将任何数据放在粘贴板上,除了源应用程序之外的应用程序可以接受。

这是我尝试过的代码,当我进入其他一些NSTextField时,我认为这足以让“hello”这个词被“粘贴”:

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

    [pboard declareTypes:[NSArray arrayWithObject:NSStringPboardType] owner:self];
    [pboard setString:@"hello" forType:NSStringPboardType];

return YES;

}

// -

我从未得到显示我将接受掉落的光标,它只是不起作用。

  • 我尝试过的事情:
    • 使用10.5版本的Pasteboard标识符, NSStringPBoardType
    • 使用10.6版本,NSPasteboardTypeString。
    • 设置所有者= nil,因为我没有懒惰地提供数据。
    • 使用键控归档器:[pboard setData:[NSKeyedArchiver archivedRootObject:@“Hello !!”]]

以上都没有奏效。我认为我的概念是正确的:“编码数据,告诉粘贴板你有什么,然后给它数据”,但由于其他应用程序无法识别它,我怀疑我没有告诉粘贴板正确的数据类型。

我哪里错了?

谢谢, 木本

1 个答案:

答案 0 :(得分:6)

在控制器类的awakeFromNib

中添加此项
- (void)awakeFromNib {
    [tableView setDraggingSourceOperationMask:NSDragOperationEvery forLocal:NO];
    // [tableView setDraggingSourceOperationMask:NSDragOperationEvery forLocal:YES];

}

(假设您有IBOutlet连接到名为tableView的tableView。请务必在awakeFromNib或更高版本中执行此操作。 (例如,如果您尝试在控制器类的init方法中执行此操作,则您的nib文件尚未完全加载,并且您的IBOutlet将全部为nil并且消息没有效果。)

默认情况下,大多数拖动操作仅限于本地应用程序而不是所有应用程序。 forLocal:参数指定您是引用应用程序本地(在同一应用程序内)还是非本地(即所有应用程序)的拖动操作。注释掉的行基本上就是你已经使用tableView的行。