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.
今天,我有一个带有两个NSTextFIElds的窗口,我希望它们具有不同的放置行为,我不想在窗口中的任何其他位置允许放置.我解释文档的方式,似乎我要么必须子类化NSTextFIEld,要么在窗口的委托上创建一些巨大的意大利面条件下拉处理程序,它们针对每个视图点击检查draggingLocation,以便选择不同的drop-area行为.每个领域.
基于NSWindow-delegate的集中式丢弃处理程序方法似乎在任何情况下都是繁重的,在这种情况下,您只有少量的drop目标视图.同样,无论情况如何,子类化方法似乎都很繁琐,因为现在丢弃处理代码存在于视图类中,因此一旦接受了丢弃,您就必须想出一些方法来将丢弃的数据封送回模型. bindings docs通过以编程方式设置UI值来警告您尝试驱动绑定.所以现在你也被困在那里.
所以我的问题是:“真的!?那些是唯一随时可用的选择吗?或者我在这里错过了一些直截了当的东西?”
谢谢.
解决方法 经过一番研究后,看来“是的,真的,你的两个选择要么是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拖放需要子类……真的吗?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)