如何实现自定义UITextInputTokenizer?

Jos*_*urr 13 tokenize uitextview ios swift

我有一个UITextView,并使用其tokenizer来检查用户点击的单词.

我的目标是改变tokenizer所认为的单词.目前似乎将单词定义为连续的字母数字字符,我希望将单词定义为不是空格字符("")的连续字符.

例如:'foo-bar','foo/bar'和'foo @@ bar'目前都将被视为两个单独的单词('foo'和'bar'),但我希望它们都被视为单个单词单词(因为它们都不包含空格).

该文档讨论了UITextInputStringTokenizer类的子类化,但我找不到某个人这样做的例子,我无法弄清楚如何实现所需的方法:

func isPosition(position: UITextPosition, atBoundary granularity: UITextGranularity, inDirection direction: UITextDirection) -> Bool

func isPosition(position: UITextPosition, withinTextUnit granularity: UITextGranularity, inDirection direction: UITextDirection) -> Bool

func positionFromPosition(position: UITextPosition, toBoundary granularity: UITextGranularity, inDirection direction: UITextDirection) -> UITextPosition?

func rangeEnclosingPosition(position: UITextPosition, withGranularity granularity: UITextGranularity, inDirection direction: UITextDirection) -> UITextRange?
Run Code Online (Sandbox Code Playgroud)

Vic*_*cas 1

总而言之,创建扩展的实现UITextInputStringTokenizer并保持大多数方法不变(或仅调用super

您只需要覆盖isPosition(_:atBoundary:inDirection:)andisPosition(_:withinTextUnit:inDirection:)当粒度为单词时,检查该位置旁边的字符是否被视为位于单词边界中,即字母数字字符和空格在一起。默认实现还将返回true被视为不属于单词一部分的其他非空格,而是将它们视为构成单词的一部分。当粒度不是单词时,您super也可以默认为。