我知道有一个 InputMethodKit 框架的 API 参考。Objective-C 中也有示例代码,但它没有提供 Swift 中的示例。
有谁知道如何在 Swift 中制作一个简单的 IME?它可以具有重复字母但不做任何事情的功能,所以我可以知道它确实有效。您使用哪些 Xcode SDK 构建并成功运行它?
我已经将Apple的NumberInput
示例代码上传到github存储库中,以便于阅读:
https://github.com/pkamb/NumberInput_IMKit_Sample
具体来说,我已经将示例项目演示中的每个"步骤"作为自己的 git 提交上传。这样可以更轻松地区分项目工作流。按照操作,了解他们如何向示例输入法项目添加要素。
我也尝试将Apple的IMKit示例第一部分"NumberInput 0"项目从Objective-c转换为Swift
如果 Swift 项目中的 "NumberInput 0" 有效,那么跟随 NumberInput 1,2,3 可以快速转换。
Swift 项目中的"NumberInput 0"可以编译、安装、添加到输入源中,可以选择和运行,但是当我使用 Xcode 调试时,IMKInputController 子类 NumberInputController 的方法 inputText(...) 无法通过键入键来访问 NumberInput.app
NumberInput 0 只是只包含 4 个文件,几行代码:
- 应用代表.swift
- 数字输入控制器.swift
- 主菜单.xib
- 信息列表
NumberInputController 列在 info.plist 中。
我已经成功地使用带有Xcode 7的Objective-C重新创建了"NumberInput 0"项目,所有工作正常,NumberInputController函数inputText(...)可以通过调试时键入键来访问。
我是 Swift 的新手,有人能帮我在 Swift 中获取"NumberInput 0"吗?
以下是 3 个文件的内容:
应用委托.swift
import Cocoa
import InputMethodKit
let kConnectionName = "NumberInput_1_Connection"
var server:IMKServer = IMKServer.init()
@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {
func applicationDidFinishLaunching(aNotification: NSNotification) {
let identifier = NSBundle.mainBundle().bundleIdentifier;
server = IMKServer.init(name: kConnectionName, bundleIdentifier: identifier)
}
func applicationWillTerminate(aNotification: NSNotification) {
}
}
数字输入控制器.swift
import Cocoa
import InputMethodKit
class NumberInputController: IMKInputController {
override func inputText(string:String, client: AnyObject) ->Bool {
// Debug break point put here
print(string);
return false;
}
}
信息列表
...
<dict>
....
<key>NSMainNibFile</key>
<string>MainMenu</string>
<key>NSPrincipalClass</key>
<string>NSApplication</string>
<key>LSBackgroundOnly</key>
<string>1</string>
<key>InputMethodConnectionName</key>
<string>NumberInput_1_Connection</string>
<key>InputMethodServerControllerClass</key>
<string>NumberInputController</string>
<key>tsInputMethodIconFileKey</key>
<string>nine.tiff</string>
<key>tsInputMethodCharacterRepertoireKey</key>
<array>
<string>Latn</string>
</array>
</dict>
</plist>
谢谢。