【问题标题】:Help With Intra-Application Drag and Drop -- Cocoa帮助应用程序内拖放 - Cocoa
【发布时间】:2010-01-11 16:05:35
【问题描述】:

好的,我有一个名为“Task”的自定义类,它表示要完成的任务。我有一个充当日历的 NSMatrix。我希望用户能够将 nscollectionview 中的图标(我在设置 nscollectionview 时没有遇到问题)拖到 nsmatrix 中的一个单元格上,从而将该任务分配给那天。我似乎根本无法让 nsmatrix 响应拖放。

我已经实现了方法:

- (BOOL)collectionView:(NSCollectionView *)cv writeItemsAtIndexes:(NSIndexSet *)indexes toPasteboard:(NSPasteboard *)pasteboard
{
    [pasteboard declareTypes:[NSArray arrayWithObject:TASK_UTI]  owner:self];
    NSUInteger index=[indexes firstIndex];
    Task* task=[[cv content] objectAtIndex:index];
    NSData* taskData=[NSKeyedArchiver archivedDataWithRootObject:task];
    [taskData retain];
    BOOL success=[pasteboard setData:taskData forType:TASK_UTI];

    return success;
}

在我的 nscollectionview 委托中,如上所示。 我在我的 NSMatrix 子类(称为“日历”)中发送了 [self registerForDraggedTypes:[NSArray arrayWithObjects:TASK_UTI, nil]]。 我已经实现了这些方法:

- (NSDragOperation)draggingEntered:(id < NSDraggingInfo >)sender
- (BOOL)prepareForDragOperation:(id < NSDraggingInfo >)sender
- (BOOL)performDragOperation:(id < NSDraggingInfo >)sender

在我的日历(NSMatrix 子类)类中。

一些调试显示 NSMatrix/Calendar 对象甚至没有运行上面的拖动方法。什么给了?

【问题讨论】:

  • “我在我的 NSMatrix 子类中发送了 [self registerForDraggedTypes:[NSArray arrayWithObjects:TASK_UTI, nil]]……”你确定吗?你是通过什么方式发送的?您是否使用NSLog 来证明该代码已运行?
  • 我在 -awakeFromNib 方法中运行它,是的,我运行了 NSLog 代码:NSLog(@"Registered Drag types:%@", [[self registeredDraggedTypes] description]);结果如下: 2010-01-11 18:54:59.963 Planner[48548:a0f] Registered Drag types:( "com.yourcompany.YGPlannerTask" )

标签: objective-c cocoa drag-and-drop


【解决方案1】:

您是否定义了日历类来实现拖动目标协议?

【讨论】:

  • 你到底是什么意思?我在问题中写道,我实现了 3 种方法: - (NSDragOperation)draggingEntered:(id )sender - (BOOL)prepareForDragOperation:(id )sender - (BOOL)performDragOperation:(id )发件人我还有什么事情要做吗?
  • 我的错。我知道有些东西不见了(但不太确定,所以我猜测了一下)。这是您缺少的东西(摘自苹果文档:=== 要接收拖动操作,您必须通过向对象发送 registerForDraggedTypes: 消息来注册窗口或视图将接受的粘贴板类型,该消息在 NSWindow 和 NSView 中定义,并从 NSDraggingDestination 协议中实现几个方法 === 整个拖放指南在这里:developer.apple.com/mac/library/documentation/Cocoa/Conceptual/…
  • 我确实发送了这条消息,请参阅上面的评论
  • 我花了几个小时研究拖放指南,但没有成功。也许我的尿路感染有问题??
【解决方案2】:

首先,您应该在 UTI 中使用自己的域名,而不是“com.yourcompany”。

第二,你export the UTI in your Info.plist了吗?

【讨论】:

  • 谢谢。我确实认为问题出在 UTI 上,但 Apple Docs 根本没有帮助我。他们没有明确说明如何设置您自己的 UTI。我试过在我的 info.plist 中导出它,但我不确定我做对了。你能解释一下我需要做什么来建立自己的 UTI 吗?
  • 我已经检查过了,问题肯定是 UTI——如果我在所有地方将“TASK_UTI”更改为“NSPasteBoardStringType”,一切正常。
  • Joe Atkin:从我链接到的章节中:“除了声明 UTI 字符串之外,声明还可以包含以下任何属性……”暗示只需要 UTI 本身。如果这不起作用,您应该编辑您的问题以包含声明。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-09
  • 1970-01-01
  • 2010-12-20
相关资源
最近更新 更多