我正在开发IOS自定义键盘。我想知道是否有办法获取文本字段内的当前文本以及它将如何工作。
例如,我们可以使用textDocumentProxy.hasText()
查看文本字段是否包含文本但我想知道文本字段中的确切字符串。
答案 0 :(得分:6)
最接近的内容是textDocumentProxy.documentContextBeforeInput
和textDocumentProxy.documentContextAfterInput
。这些将尊重句子等,这意味着如果值是段落,您将只获得当前句子。已知用户通过多次重新定位光标来检索整个字符串,直到检索到所有内容。
当然,如果字段需要单个值(如用户名,电子邮件,ID号等),通常不必担心这一点。在输入上下文之前和之后组合值都应该足够了。
对于单个短语值,您可以这样做:
let value = (textDocumentProxy.documentContextBeforeInput ?? "") + (textDocumentProxy.documentContextAfterInput ?? "")
对于可能包含句子结束标点符号的值,由于需要在单独的线程上运行它,因此会稍微复杂一些。因此,以及必须移动输入光标以获取全文的事实,光标将明显移动。还不知道这是否会被AppStore接受(毕竟,为了防止官方自定义键盘侵入用户的隐私,Apple可能没有添加一个简单的方法来获取全文,以此来防止用户的隐私)。
注意:下面的代码基于this Stack Overflow answer,除了为Swift修改,删除了不必要的睡眠,使用没有自定义类别的字符串,并使用更有效的移动过程。
func foo() {
dispatch_async(dispatch_queue_create("com.example.test", DISPATCH_QUEUE_SERIAL)) { () -> Void in
let string = self.fullDocumentContext()
}
}
func fullDocumentContext() {
let textDocumentProxy = self.textDocumentProxy
var before = textDocumentProxy.documentContextBeforeInput
var completePriorString = "";
// Grab everything before the cursor
while (before != nil && !before!.isEmpty) {
completePriorString = before! + completePriorString
let length = before!.lengthOfBytesUsingEncoding(NSUTF8StringEncoding)
textDocumentProxy.adjustTextPositionByCharacterOffset(-length)
NSThread.sleepForTimeInterval(0.01)
before = textDocumentProxy.documentContextBeforeInput
}
// Move the cursor back to the original position
self.textDocumentProxy.adjustTextPositionByCharacterOffset(completePriorString.characters.count)
NSThread.sleepForTimeInterval(0.01)
var after = textDocumentProxy.documentContextAfterInput
var completeAfterString = "";
// Grab everything after the cursor
while (after != nil && !after!.isEmpty) {
completeAfterString += after!
let length = after!.lengthOfBytesUsingEncoding(NSUTF8StringEncoding)
textDocumentProxy.adjustTextPositionByCharacterOffset(length)
NSThread.sleepForTimeInterval(0.01)
after = textDocumentProxy.documentContextAfterInput
}
// Go back to the original cursor position
self.textDocumentProxy.adjustTextPositionByCharacterOffset(-(completeAfterString.characters.count))
let completeString = completePriorString + completeAfterString
print(completeString)
return completeString
}