Cocoa NSTextField 拖放需要子类...真的吗?

Posted

技术标签:

【中文标题】Cocoa NSTextField 拖放需要子类...真的吗?【英文标题】:Cocoa NSTextField Drag & Drop Requires Subclass... Really? 【发布时间】:2011-06-05 21:53:18 【问题描述】:

直到今天,除了 NSWindow 本身作为 NSDraggingDestination 之外,我还没有机会使用任何其他东西。当使用一个窗口作为一刀切的拖动目标时,NSWindow 会将这些消息传递给它的委托,允许您在不继承 NSWindow 的情况下处理拖放。

docs 说:

虽然 NSDraggingDestination 是 宣布为非正式协议, NSWindow 和 NSView 子类你 创建采用协议只需要 实现那些方法 相关的。 (NSWindow 和 NSView 类提供私人 所有的实现 方法。)窗口对象或 它的代表可以实现这些 方法;然而,代表的 如果执行优先 两者都有实现 地方。

今天,我有一个窗口,上面有两个 NSTextField,我希望它们具有不同的放置行为,并且我不想允许在窗口中的其他任何地方放置。我解释文档的方式,似乎我要么必须继承 NSTextField,要么在窗口的委托上制作一些巨大的意大利面条条件放置处理程序,针对每个视图对 draggingLocation 进行命中检查,以便选择不同的放置区域行为每个字段。

基于 NSWindow-delegate 的集中式放置处理程序方法似乎在您拥有多个放置目标视图的任何情况下都会很繁重。同样,无论哪种情况,子类化方法似乎都很繁琐,因为现在丢弃处理代码存在于视图类中,因此一旦您接受了丢弃,您必须想出一些方法将丢弃的数据编组回模型。 bindings docs 警告您不要尝试通过以编程方式设置 UI 值来驱动绑定。所以现在你也被困住了。

所以我的问题是:“真的!?这些是唯一现成的选择吗?还是我在这里遗漏了一些简单的东西?”

谢谢。

【问题讨论】:

您应该修正问题标题中的错字(NSTextView != NSTextField)。 【参考方案1】:

经过更多研究,似乎“是的,真的,您的两个选择是继承 NSTextField 或使用您的 NSWindowDelegate 来处理丢弃。”我会更进一步,并声称两者中更好的方法,对于“我想要在一个窗口中有多个拖放区”的花园各种情况,是使用带有命中检查的 NSWindowDelegate 方法,因为你避免了将您的拖放处理代码放在视图端。我最终在我的窗口委托类上使用了这个 draggingUpdated: 方法:

- (NSDragOperation)draggingUpdated:(id<NSDraggingInfo>)sender

    NSPasteboard *pboard = [sender draggingPasteboard];
    NSDragOperation sourceDragMask = [sender draggingSourceOperationMask];

    if ([pboard.types containsObject: NSFilenamesPboardType] && (sourceDragMask & NSDragOperationCopy))
    
        NSView* hitView = [sender.draggingDestinationWindow.contentView hitTest: sender.draggingLocation];
        if (hitView && (hitView == mSourceTextField || hitView == mDestTextField))
        
            return NSDragOperationCopy;            
        
    

    return NSDragOperationNone;

显然,整个画面还有更多内容,但到目前为止,这种基于 hitTest: 的方法对我很有效。我怀疑如果使用基于多 NSCell 的控件(如 NSTableView 或 NSOutlineView),这会稍微复杂一些,但不出所料,它们有自己的拖动处理方法。

希望这对其他人有所帮助。

【讨论】:

以上是关于Cocoa NSTextField 拖放需要子类...真的吗?的主要内容,如果未能解决你的问题,请参考以下文章

COCOA - 如何在NSTextfield中达到最大长度时,文本字段不允许输入文本?

使用 Cocoa 填充 PDF - 使用 NSTextField 内容填充 PDF 文本字段?

Cocoa NSTextField - 绑定和设置属性

更改为等宽数字字体后,Cocoa NSTextField 文本在视图中被截断

如何处理 NSTextField 子类的第一响应者状态?

NSTextField 子类化后淡出