草庐IT

swift - 在 ViewController 中处理菜单项操作

coder 2023-09-12 原文

我想在我的 View Controller 中处理对菜单项“打开”的点击。

似乎只能在我的 AppDelegate 中处理它。这里描述的问题 [1] 与我想做的非常相似,但我认为必须有一种更动态的方法,并且不需要 AppDelegate 知道将它准确转发到哪里。如果我想根据当前 View 更改操作怎么办?

这是我用 cocoa 编写的第一个应用程序,所以我对“响应链”[2] 和“委托(delegate)”还不是很熟悉,但似乎我必须对它们做些事情。

[1] Connect to ViewController from AppDelegate (Swift)
[2] Cocoa Storyboard Responder Chain

最佳答案

What if I want to change the action depending on the current view?

您确实需要了解响应链才能了解菜单命令的处理方式。简而言之, View 、 View Controller 、窗口 Controller 、文档和应用程序本身都是 NSResponder 的实例,它提供了处理按键和菜单命令等事件的机制。在任何给定时刻都有一个“第一响应者”,这是第一个有机会处理此类事件的对象。如果该对象不处理有问题的事件,该事件将向上传递到链中的下一个响应者,依此类推,直到它到达应用程序。

例如,当您在基于 Cocoa 的文本编辑器中键入字母“a”时,该按键将发送给第一响应者。如果有一个文档窗口打开并处于事件状态,那么第一响应者可能是某个 TextView ,它将在插入点插入“a”,并可能通知其代理文本已更改。另一方面,如果您在同一个窗口处于事件状态的情况下选择"file"->“关闭”命令,则该事件将从 TextView 开始, TextView 可能无法处理它,因此它将向上传递到父 View ,窗口,到窗口 Controller ,最后到达文档,它知道如何处理该命令。另一方面,如果命令是 File->Quit,那么在它被处理之前,命令将一直传递到应用程序。这在 Cocoa 和 Cocoa Touch 编程中被称为“响应链”,但这里的模式也被称为 "chain of responsibility."。响应者链不仅用于处理事件,还用于诸如菜单验证之类的事情。

上下文菜单命令的处理方式相同。唯一真正不同的是上下文菜单的创建方式:当用户执行任何手势调出上下文菜单(通常是按住 Control 单击或右键单击)时,上下文菜单是通过询问第一响应者(再次,当前“聚焦”的东西)应该显示什么菜单。 NSView 有一个 -menuForEvent: 方法,通常只返回 View 的 menu 属性的内容,所以你可以设置 menu 属性与 NSMenu 的实例,或者您可以覆盖 -menuForEvent: 以便它构建菜单。当用户选择一个上下文菜单命令时,它将像任何其他菜单命令一样被处理,从第一响应者开始。这意味着第一响应者不一定需要处理它提供的上下文菜单中的所有项目——可能有像“复制”或“粘贴”这样的项目由链上游的其他对象处理。

关于swift - 在 ViewController 中处理菜单项操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48164231/

有关swift - 在 ViewController 中处理菜单项操作的更多相关文章

  1. ruby - 如何指定 Rack 处理程序 - 2

    Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack

  2. ruby - 如何使用 Selenium Webdriver 根据 div 的内容执行操作? - 2

    我有一个使用SeleniumWebdriver和Nokogiri的Ruby应用程序。我想选择一个类,然后对于那个类对应的每个div,我想根据div的内容执行一个Action。例如,我正在解析以下页面:https://www.google.com/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=puppies这是一个搜索结果页面,我正在寻找描述中包含“Adoption”一词的第一个结果。因此机器人应该寻找带有className:"result"的div,对于每个检查它的.descriptiondiv是否包含单词“adoption

  3. ruby-on-rails - 如何处理 Grape 中特定操作的过滤器之前? - 2

    我正在我的Rails项目中安装Grape以构建RESTfulAPI。现在一些端点的操作需要身份验证,而另一些则不需要身份验证。例如,我有users端点,看起来像这样:moduleBackendmoduleV1classUsers现在如您所见,除了password/forget之外的所有操作都需要用户登录/验证。创建一个新的端点也没有意义,比如passwords并且只是删除password/forget从逻辑上讲,这个端点应该与用户资源。问题是Grapebefore过滤器没有像except,only这样的选项,我可以在其中说对某些操作应用过滤器。您通常如何干净利落地处理这种情况?

  4. ruby-on-rails - 在 Ruby on Rails 中发送响应之前如何等待多个异步操作完成? - 2

    在我做的一些网络开发中,我有多个操作开始,比如对外部API的GET请求,我希望它们同时开始,因为一个不依赖另一个的结果。我希望事情能够在后台运行。我找到了concurrent-rubylibrary这似乎运作良好。通过将其混合到您创建的类中,该类的方法具有在后台线程上运行的异步版本。这导致我编写如下代码,其中FirstAsyncWorker和SecondAsyncWorker是我编写的类,我在其中混合了Concurrent::Async模块,并编写了一个名为“work”的方法来发送HTTP请求:defindexop1_result=FirstAsyncWorker.new.async.

  5. Ruby-vips 图像处理库。有什么好的使用示例吗? - 2

    我对图像处理完全陌生。我对JPEG内部是什么以及它是如何工作一无所知。我想知道,是否可以在某处找到执行以下简单操作的ruby​​代码:打开jpeg文件。遍历每个像素并将其颜色设置为fx绿色。将结果写入另一个文件。我对如何使用ruby​​-vips库实现这一点特别感兴趣https://github.com/ender672/ruby-vips我的目标-学习如何使用ruby​​-vips执行基本的图像处理操作(Gamma校正、亮度、色调……)任何指向比“helloworld”更复杂的工作示例的链接——比如ruby​​-vips的github页面上的链接,我们将不胜感激!如果有ruby​​-

  6. ruby - 在 Ruby 中是否有一种惯用的方法来操作 2 个数组? - 2

    a=[3,4,7,8,3]b=[5,3,6,8,3]假设数组长度相同,是否有办法使用each或其他一些惯用方法从两个数组的每个元素中获取结果?不使用计数器?例如获取每个元素的乘积:[15,12,42,64,9](0..a.count-1).eachdo|i|太丑了...ruby1.9.3 最佳答案 使用Array.zip怎么样?:>>a=[3,4,7,8,3]=>[3,4,7,8,3]>>b=[5,3,6,8,3]=>[5,3,6,8,3]>>c=[]=>[]>>a.zip(b)do|i,j|c[[3,5],[4,3],[7,6],

  7. ruby - Faye WebSocket,关闭处理程序被触发后重新连接到套接字 - 2

    我有一个super简单的脚本,它几乎包含了FayeWebSocketGitHub页面上用于处理关闭连接的内容:ws=Faye::WebSocket::Client.new(url,nil,:headers=>headers)ws.on:opendo|event|p[:open]#sendpingcommand#sendtestcommand#ws.send({command:'test'}.to_json)endws.on:messagedo|event|#hereistheentrypointfordatacomingfromtheserver.pJSON.parse(event.d

  8. ruby-on-rails - 如何让 Rails View 返回其关联的操作名称? - 2

    我有一个非常简单的Controller来管理我的Rails应用程序中的静态页面:classPagesController我怎样才能让View模板返回它自己的名字,这样我就可以做这样的事情:#pricing.html.erb#-->"Pricing"感谢您的帮助。 最佳答案 4.3RoutingParametersTheparamshashwillalwayscontainthe:controllerand:actionkeys,butyoushouldusethemethodscontroller_nameandaction_nam

  9. ruby - 如何使用 Ruby HTTP::Net 处理 404 错误? - 2

    我正在尝试解析网页,但有时会收到404错误。这是我用来获取网页的代码:result=Net::HTTP::getURI.parse(URI.escape(url))如何测试result是否为404错误代码? 最佳答案 像这样重写你的代码:uri=URI.parse(url)result=Net::HTTP.start(uri.host,uri.port){|http|http.get(uri.path)}putsresult.codeputsresult.body这将打印状态码和正文。

  10. ruby-on-rails - 使用 Ruby 正确处理 Stripe 错误和异常以实现一次性收费 - 2

    我查看了Stripedocumentationonerrors,但我仍然无法正确处理/重定向这些错误。基本上无论发生什么,我都希望他们返回到edit操作(通过edit_profile_path)并向他们显示一条消息(无论成功与否)。我在edit操作上有一个表单,它可以POST到update操作。使用有效的信用卡可以正常工作(费用在Stripe仪表板中)。我正在使用Stripe.js。classExtrasController5000,#amountincents:currency=>"usd",:card=>token,:description=>current_user.email)

随机推荐