【问题标题】:Drag String data from My Cocoa App to Third-Party Cocoa App将字符串数据从 My Cocoa App 拖到第三方 Cocoa App
【发布时间】:2010-12-22 16:32:21
【问题描述】:

我想从我的 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;

}

//--

我从来没有得到显示我接受 drop 的光标,它只是不起作用。

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

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

我哪里出错了?

谢谢, 伍迪

【问题讨论】:

    标签: cocoa drag-and-drop clipboard pasteboard


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 就是这样。正如你所说,把那条线放进去,现在所有的引擎都走了。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多