问题描述
|
我正在为用户使用NSTextView键入他们的响应。我打开了连续拼写检查,不正确的单词下面有一条红线。我有一个共享的SpellChecker,正在使用中。但我希望用户右键单击并更正拼写。我有以下问题-
在“文本编辑”中,右键单击该单词会突出显示该单词,我该如何实现?我打算获取selectedrange并将其传递给拼写检查器。
将拼写检查建议添加到上下文菜单后,当我转到下一个单词时它仍会显示,因此在添加任何新项目之前,我应始终清除上下文菜单吗?
我正在使用Monobjc,当我执行以下代码时,出现异常-
var t = Menu.ItemArray;
foreach(t中的var s)
{
var menuItem = s.CastAs (); //例外
}
我基本上是尝试让个人NSMenuItem检查它是否拼写建议或其他。
编辑-添加了stacktrace
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)
at E5EEC20A.objc_msgSendSuper (IntPtr receiver,System.Object[] parameters) [0x00000] in <filename unkNown>:0
at Monobjc.Bridge.Generators.DynamicmessagingGenerator.SendMessage (System.String message,IntPtr receiver,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.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 ) [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)
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点)
NSTextView.SelectedRange
返回第一个选定范围。如果未选择任何文本,则范围的长度为0,范围的位置为光标所在字符的索引。
然后,获取对字符串上下文(NSTextView.TextStorage.String
)的引用,并在光标位置之前和之后搜索空格。您将获得选择单词的范围。
用NSTextView.SelectedRange
指定新的选择范围。
对于第2点)
右键单击后,您可以完全控制返回的Menu实例。因此,如果向其中添加项目,则必须自己删除它们。
对于第3点)
看起来像个错误。如注释中所述,在索引循环中使用NumberOfItems
和ItemAtIndex
方法。