在应用程序中使用自定义 InputViewController
Use custom InputViewController in app
我当前的作业是 iOS 键盘扩展。现在,要通过 App Store 审核,包含应用程序必须提供一些 "real" 内容。我考虑过让用户在设置中启用键盘之前测试键盘。所以我的故事板看起来像这样(缩小以显示相关内容):
└ ViewController
└ View
├ TextField
└ Keyboard Container
└ KeyboardViewController
一切正常,键盘显示在容器中,但是 - 由于键盘视图控制器中的 textDocumentProxy
对象没有附加到任何东西 - 用户看不到什么 s/he 正在输入。
现在我正在寻找一种方法 "attach" 将键盘连接到文本字段,同时让系统键盘不碍事,以便用户可以在自定义键盘上键入。
我已经通过将以下函数附加到文本字段的 editing did begin
操作来设法摆脱系统键盘。
@IBAction func editingBegan(sender: UITextField) {
sender.endEditing(true)
}
我设法找到了以下解决方法:
我创建了一个 class,它实现了 UITextDocumentProxy 协议,写入文本字段,并将其设置为键盘视图控制器中的附加代理:
class ProxyWrapper: NSObject, UITextDocumentProxy {
private let textField: UITextField
init(textField: UITextField) {
self.textField = textField
}
var documentContextBeforeInput: String? {
get {
return textField.text
}
}
var documentContextAfterInput: String? {
get {
return ""
}
}
func adjustTextPositionByCharacterOffset(offset: Int) {}
func insertText(text: String) {
let ntext = text.stringByReplacingOccurrencesOfString("\n", withString: "")
textField.text = (textField.text ?? "") + ntext
}
func deleteBackward() {
if let text = textField.text {
textField.text = text.substringToIndex(text.endIndex.advancedBy(-1))
}
}
func hasText() -> Bool {
return textField.hasText()
}
}
如您所见,我只实现了一个非常简约的 class(文本 input/deletion 仅在末尾),因为我完全禁用了文本字段的用户交互性,所以没有 "real" 键盘会弹出。另外,我不允许插入换行符。
它可能看起来有点老套,并且可能有更好的解决方案(请随时告诉我),但这很有效,因此我使用了它。
我当前的作业是 iOS 键盘扩展。现在,要通过 App Store 审核,包含应用程序必须提供一些 "real" 内容。我考虑过让用户在设置中启用键盘之前测试键盘。所以我的故事板看起来像这样(缩小以显示相关内容):
└ ViewController
└ View
├ TextField
└ Keyboard Container
└ KeyboardViewController
一切正常,键盘显示在容器中,但是 - 由于键盘视图控制器中的 textDocumentProxy
对象没有附加到任何东西 - 用户看不到什么 s/he 正在输入。
现在我正在寻找一种方法 "attach" 将键盘连接到文本字段,同时让系统键盘不碍事,以便用户可以在自定义键盘上键入。
我已经通过将以下函数附加到文本字段的 editing did begin
操作来设法摆脱系统键盘。
@IBAction func editingBegan(sender: UITextField) {
sender.endEditing(true)
}
我设法找到了以下解决方法:
我创建了一个 class,它实现了 UITextDocumentProxy 协议,写入文本字段,并将其设置为键盘视图控制器中的附加代理:
class ProxyWrapper: NSObject, UITextDocumentProxy {
private let textField: UITextField
init(textField: UITextField) {
self.textField = textField
}
var documentContextBeforeInput: String? {
get {
return textField.text
}
}
var documentContextAfterInput: String? {
get {
return ""
}
}
func adjustTextPositionByCharacterOffset(offset: Int) {}
func insertText(text: String) {
let ntext = text.stringByReplacingOccurrencesOfString("\n", withString: "")
textField.text = (textField.text ?? "") + ntext
}
func deleteBackward() {
if let text = textField.text {
textField.text = text.substringToIndex(text.endIndex.advancedBy(-1))
}
}
func hasText() -> Bool {
return textField.hasText()
}
}
如您所见,我只实现了一个非常简约的 class(文本 input/deletion 仅在末尾),因为我完全禁用了文本字段的用户交互性,所以没有 "real" 键盘会弹出。另外,我不允许插入换行符。
它可能看起来有点老套,并且可能有更好的解决方案(请随时告诉我),但这很有效,因此我使用了它。