NSTextView中的上下文菜单

时间:2011-05-31 14:50:09

标签: objective-c cocoa mono monobjc

我正在使用NSTextView让用户输入他们的回复。我打开了连续的拼写检查,不正确的单词下面有一条红线。我有一个共享的SpellChecker,我正在使用它。但我希望用户右键单击并更正拼写。我有以下问题 -

  1. 在文本编辑中,只要您单击右键,它就会突出显示该单词,我该如何实现相同的目标?我打算获取选定的范围并将其传递给拼写检查程序。

  2. 一旦拼写检查建议被添加到上下文菜单中,当我转到下一个单词时它仍会显示,所以在添加任何新项目之前我是否应该总是清除上下文菜单?

  3. 我正在使用Monobjc,当我执行以下代码时,我得到一个异常 -

    var t = Menu.ItemArray;

    foreach(var s in t)

    {

    var menuItem = s.CastAs< NSMenuItem>(); //例外

    }

  4. 我基本上尝试让单个NSMenuItem检查它是否拼写建议或其他内容。

    编辑 - 添加了堆栈跟踪

    System.InvalidCastException: Cannot cast from source type to destination type.
      at example.test.MacOS.UI.HTML.ESView.MenuForEvent (Monobjc.Cocoa.NSEvent theEvent) [0x00000] in <filename unknown>:0 
      at Monobjc.Dynamic.Proxies.example.test.MacOS.UI.HTML.ESView.MenuForEvent_Monobjc_Cocoa_NSEvent (IntPtr receiver, IntPtr selector, IntPtr ) [0x00000] in <filename unknown>:0 
      at (wrapper native-to-managed) Monobjc.Dynamic.Proxies.example.test.MacOS.UI.HTML.ESView:MenuForEvent_Monobjc_Cocoa_NSEvent (intptr,intptr,intptr)
      at (wrapper managed-to-native) E5EEC20A:pinvoke (intptr,intptr,intptr)
      at E5EEC20A.objc_msgSendSuper (IntPtr receiver, IntPtr selector, System.Object[] parameters) [0x00000] in <filename unknown>:0 
      at Monobjc.Bridge.Generators.DynamicMessagingGenerator.SendMessage (System.String message, IntPtr receiver, IntPtr selector, System.Object[] parameters) [0x00000] in <filename unknown>:0 
      at Monobjc.ObjectiveCRuntime.SendMessageSuper (IManagedWrapper receiver, Monobjc.Class cls, System.String selector, System.Object[] parameters) [0x00000] in <filename unknown>:0 
      at Monobjc.Id.SendMessageSuper (Monobjc.Class cls, System.String selector, System.Object[] parameters) [0x00000] in <filename unknown>:0 
      at example.test.MacOS.UI.App.Application.SendEvent (Monobjc.Cocoa.NSEvent theEvent) [0x00000] in <filename unknown>:0 
      at Monobjc.Dynamic.Proxies.example.test.MacOS.UI.App.Application.SendEvent_Monobjc_Cocoa_NSEvent (IntPtr receiver, IntPtr selector, IntPtr ) [0x00000] in <filename unknown>:0 
      at (wrapper native-to-managed) Monobjc.Dynamic.Proxies.example.test.MacOS.UI.App.Application:SendEvent_Monobjc_Cocoa_NSEvent (intptr,intptr,intptr)
      at (wrapper managed-to-native) Monobjc.ObjectiveCRuntime:objc_msgSend (intptr,intptr)
      at Monobjc.ObjectiveCRuntime.SendMessage (IManagedWrapper receiver, System.String selector) [0x00000] in <filename unknown>:0 
      at Monobjc.Cocoa.NSApplication.Run () [0x00000] in <filename unknown>:0 
      at example.test.MacOS.UI.App.Application.RunApplication () [0x00000] in <filename unknown>:0 
      at example.test.MacOS.Program.Main (System.String[] args) [0x00000] in <filename unknown>:0 
    

    编辑 - 第3步

    问题3的工作基于劳伦特的建议。

1 个答案:

答案 0 :(得分:3)

对于第1点)

  • NSTextView.SelectedRange返回第一个选定范围。如果没有选择文本,则范围的长度为0,范围的位置是光标所在字符的索引。
  • 然后,获取对字符串上下文(NSTextView.TextStorage.String)的引用,并在光标位置之前和之后搜索空格。您将获得要选择的单词的范围。
  • 使用NSTextView.SelectedRange指定新的选择范围。

对于第2点)

完成右键单击后,您可以完全控制返回的Menu实例。因此,如果您向其中添加项目,则必须自行删除它们。

对于第3点)

它看起来像一个bug。如评论中所述,请在索引循环中使用NumberOfItemsItemAtIndex方法。