- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在致力于在非 C 环境中使用 Cocoa 的拖放 API。我必须使用 objc/runtime.h 函数,因此我需要了解必须在何处注入(inject)必要的方法。
现在,SDK 文档说,首先在 NSView 或 NSWindow 对象上调用 registerForDraggedTypes。它进一步解释了这两个类都实现了 NSDraggingDestination 协议(protocol)的 stub ,并且需要覆盖这些 stub 方法(至少需要重写 DraggingEntered: 和 PerformDragOperation: ;其余的都是可选的)。
到目前为止一切顺利。
但是,我发现我也可以在窗口的 Controller 中实现这些方法,即在 NSWindowController 类型的类中。作为示例,我使用 Apple 的“DemoMonkey”示例执行此操作,其中我在其 DisplayController(它是 NSWindowController)中实现了所需的调用,然后在“self.window”上调用 registerForDraggedTypes。
这怎么行?
我的意思是,在这种情况下,接收 registerForDraggedTypes 调用的对象如何与 Controller 相关,知道它必须向 Controller 请求这些拖动回调?哪里有记录表明这种方式有效?
我想知道这是否与 NSWindowController 是 NSResponder 这一事实有关。事实上,NSDraggingDestination 调用是否通过响应者链运行? (记录一下:我还尝试创建 NSResponder 的子类,在那里实现回调而不是在 Controller 类中,创建它的实例并用它调用“self.window makeFirstResponder:”,但这并没有导致在窗口上拖动数据时调用的回调。)
任何人都可以澄清这种行为,并解释一下这个事实是在哪里记录的(或者这只是未记录的行为,因此不应依赖?)
最佳答案
发生这种情况是因为您将 registerForDraggedTypes:
发送到窗口,并且 NSWindowController 是 NSWindow 的委托(delegate)。
这在“Drag and Drop Programming Topics”中提到:
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.
以及 NSWindow 的文档 registerForDraggedTypes: :
Registering an NSWindow object for dragged types automatically makes it a candidate destination object for a dragging session. NSWindow has a default implementation for many of the methods in the NSDraggingDestination protocol. The default implementation forwards each message to the delegate if the delegate responds to the selector of the message. The messages forwarded this way are draggingEntered:, draggingUpdated:, draggingExited:, prepareForDragOperation:, performDragOperation:, and concludeDragOperation:.
如果您想实现“下拉 View ”之类的内容并在 NSView 上调用 registerForDraggedTypes:
,则不会发生这种情况。然后您需要自己将所有消息转发给 Controller 。无论哪种情况,我认为 Controller 都是更适合拖/放处理代码的地方。
关于objective-c - 为什么我可以在 NSWindowController 中实现 NSDraggingDestination 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14306821/
我正在 Xcode5 中用 cocoa 为 MacOSX 开发一个应用程序,我想通过按一个按钮从当前窗口打开另一个窗口,这是我的代码: - (IBAction)openWindow:(id)sende
我有一个扩展 NSWindowController 的 BrowserWindowController 类。我的应用程序委托(delegate)有一个 BrowserWindowController,
我的应用程序观察其 NSWindowController 的 document 属性,并在设置时执行一些 UI 设置。一旦设置完毕,就很难因更改而重建 UI(出于内部原因)。 一旦 NSWindowC
我有一个基于菜单栏的应用程序,单击图标时会显示一个窗口。在 Mac OS X Lion 上一切正常,但由于某种原因,在 Snow Leopard 和早期版本的 Mac OS X 上会出现错误。任何时候
我对 Mac 编程非常陌生。三天前刚开始。 我正在制作一个示例应用程序,其中主窗口中有一个按钮 我正在使用此代码打开一个新的 wndowcontroller ThirdViewController *
我有一个包含在 nib 文件中的窗口,该窗口由 NSWindowController 的自定义子类加载,如下所示: - (id)init { self = [super initWithWin
我是 Cocoa 编程新手。 我有一个主 NSWindowController 并且想打开第二个子 NSWindowController。无论如何似乎找不到代码。 有人可以帮忙吗? 最佳答案 不确定这
如何处理单击 NSWindowController 的红色关闭按钮的事件? 询问的原因是我在新的 NSWindowController 窗口中播放视频,当用户单击红色关闭按钮时,音频继续播放,因此我想
我正在努力使这段代码工作: class MyWindowController: NSWindowController { let thing: Thing convenience init(t
我正在创建一个 cocoa 应用程序,并且正在使用 NSWindowController 加载首选项窗口。 当用户选择首选项按钮并打开首选项窗口时 我希望应用程序强制用户在返回到后台应用程序之前完成他
我正在通过自定义方法创建并显示一个 NSWindow,它恰好是我的首选项菜单: - (void)openPreferencesWindow{ if (![self.windowControll
有一个小问题,我正忙于创建 OSX 应用程序。在我的第一个 View (appdelegate)中,我得到了一个登录屏幕,但是在用户登录后我想要(翻转登录 Controller (main.xib)以
我创建了一个 NSWindow xib 文件,我想通过单击另一个窗口中的按钮来打开该文件。 现在,为了控制 NSWindow 的行为,我从 xib 中的库中拖动了一个对象,并将其更改为我在 XCode
我有一个使用 NSWindowController 子类的简单 Cocoa 应用程序。在我设置的 Nib 中: 将所有者的类文件保存到我的 NSWindowController 子类 文件所有者到 N
我有一个 NSWindowController,它显示一个表格并使用另一个 Controller 作为 NSTableView 的数据源和委托(delegate)。第二个 Controller 显示来
我一直在一个小型 Mac 应用程序中使用 Swift。 我一直在尝试添加一个非可选实例变量,但似乎我必须重写两个 init 方法。我最终得到的(编译的)代码如下所示: class CustomWind
我目前正在尝试构建一个菜单栏应用程序。因此,我需要一个 NSWindowController 作为登录字段。必须可以在按下菜单项时打开此 NSWindowController,并在用户单击取消时关闭该
我目前正在 NSWindowController 中搜索类似 viewDidAppear() 的函数。对于我的应用程序,我需要显示 NSWindowController 几次,然后使用 NSApp.h
我正在构建一个 Cocoa 应用程序并且有一个关于使用窗口 Controller 的问题。这个想法是,如果用户从菜单栏中选择新建,则会创建一个 MyWindowController 的实例,它是 NS
在this据说可以通过从 MainMenu.xib 中删除窗口并从 applicationDidFinishLaunching: 中“手动”实例化窗口 Controller 来获得自定义 NSWind
我是一名优秀的程序员,十分优秀!