gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 16:10:57 26 4
gpt4 key购买 nike

直到今天,我还没有机会使用 NSWindow 本身以外的任何东西作为 NSDraggingDestination。当使用窗口作为通用的拖动目标时,NSWindow 会将这些消息传递给其委托(delegate),从而允许您处理拖放而无需子类化 NSWindow。

docs说:

Although NSDraggingDestination is declared as an informal protocol, the NSWindow and NSView subclasses you create to adopt the protocol need only implement those methods that are pertinent. (The NSWindow and NSView classes provide private implementations for all of the methods.) Either a window object or its delegate may implement these methods; however, the delegate’s implementation takes precedence if there are implementations in both places.

今天,我有一个带有两个 NSTextField 的窗口,我希望它们具有不同的放置行为,并且我不想允许在窗口的其他任何地方放置。按照我解释文档的方式,似乎我要么必须对 NSTextField 进行子类化,要么在窗口的委托(delegate)上创建一些巨大的意大利面条条件放置处理程序,该处理程序会针对每个 View 对拖动位置进行命中检查,以便选择不同的放置区域行为每个字段。

集中式基于 NSWindow 委托(delegate)的放置处理程序方法似乎在您拥有少量放置目标 View 的任何情况下都会很繁重。同样,无论情况如何,子类化方法似乎都很繁重,因为现在放置处理代码位于 View 类中,因此一旦您接受放置,您就必须想出某种方法将放置的数据编码(marshal)回模型。 bindings docs警告您不要尝试通过以编程方式设置 UI 值来驱动绑定(bind)。所以现在你也陷入了困境。

所以我的问题是:“真的!?这些是唯一可用的选项吗?还是我在这里错过了一些简单的东西?”

谢谢。

最佳答案

经过更多研究后,似乎“是的,确实,您的两个选择是子类化 NSTextField 或使用 NSWindowDelegate 来处理 drop。”我将进一步声明,对于花园品种的情况,“我想在一个窗口中使用多个放置区域”,这两种方法中更好的方法是使用带有命中检查的 NSWindowDelegate 方法,因为您可以避免以下问题在 View 端放置处理代码。我最终在我的窗口委托(delegate)类上使用了这个 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 拖放需要子类...真的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4636547/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com