我正在使用NSTextView让用户输入他们的回复。我打开了连续的拼写检查,不正确的单词下面有一条红线。我有一个共享的SpellChecker,我正在使用它。但我希望用户右键单击并更正拼写。我有以下问题 -
在文本编辑中,只要您单击右键,它就会突出显示该单词,我该如何实现相同的目标?我打算获取选定的范围并将其传递给拼写检查程序。
一旦拼写检查建议被添加到上下文菜单中,当我转到下一个单词时它仍会显示,所以在添加任何新项目之前我是否应该总是清除上下文菜单?
我正在使用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的工作基于劳伦特的建议。
答案 0 :(得分:3)
对于第1点)
NSTextView.SelectedRange
返回第一个选定范围。如果没有选择文本,则范围的长度为0,范围的位置是光标所在字符的索引。NSTextView.TextStorage.String
)的引用,并在光标位置之前和之后搜索空格。您将获得要选择的单词的范围。NSTextView.SelectedRange
指定新的选择范围。对于第2点)
完成右键单击后,您可以完全控制返回的Menu实例。因此,如果您向其中添加项目,则必须自行删除它们。
对于第3点)
它看起来像一个bug。如评论中所述,请在索引循环中使用NumberOfItems
和ItemAtIndex
方法。