2

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

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

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

-(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 版本的粘贴板标识符,NSStringPBoardType
    • 使用 10.6 版本,NSPasteboardTypeString。
    • 设置 owner = nil,因为我没有懒惰地提供数据。
    • 使用键控归档器:[pboard setData:[NSKeyedArchiver archivedRootObject:@"Hello!!"]]

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

我哪里错了?

谢谢,伍迪

4

1 回答 1

6

将此添加到您的控制器类中awakeFromNib

- (void)awakeFromNib {
    [tableView setDraggingSourceOperationMask:NSDragOperationEvery forLocal:NO];
    // [tableView setDraggingSourceOperationMask:NSDragOperationEvery forLocal:YES];

}

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

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

于 2011-01-01T06:29:01.583 回答