1

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

  1. 在文本编辑中,只要您单击鼠标右键,它就会突出显示该单词,我怎样才能达到相同的效果?我打算获取选定的范围并将其传递给拼写检查器。

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

  3. 我正在使用 Monobjc,当我执行以下代码时,出现异常 -

    var t = Menu.ItemArray;

    foreach(var s in t)

    {

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

    }

我基本上是尝试让单个 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 是根据 Laurent 的建议进行的。

4

1 回答 1

3

对于第 1 点)

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

对于第 2 点)

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

对于第 3 点)

它看起来像一个错误。正如评论中提到的,在索引循环中使用NumberOfItemsand方法。ItemAtIndex

于 2011-06-01T07:13:01.483 回答