在iOS 8上使用自定义键盘中的deleteBackward删除整个单词

时间:2014-10-14 14:10:35

标签: objective-c keyboard ios8

我开始开发iOS8和objective-c的自定义键盘。我想创建一个删除按钮,在插入点,单击时删除单个字符,并在按住按钮时删除整个单词。 deleteBackward似乎删除了一个字符,但在Apple开发者文档中我发现:

  

要让您在调用deleteBackward方法时确定要删除的文本数量,请从textDocumentProxy属性的documentContextBeforeInput属性获取插入点附近的文本上下文,如下所示:

NSString *precedingContext = self.textDocumentProxy.documentContextBeforeInput;
  

然后您可以删除您认为合适的内容 - 例如,   一个字符,或者一切都回到空白字符。

但我不明白如何实现这个目标......有没有办法删除一个完整的单词?

编辑:我找到了解决方案......它是documentContextBeforeInput上的简单标记:

-(void)pressDeleteKey{
NSArray *tokens = [self.textDocumentProxy.documentContextBeforeInput componentsSeparatedByString:@" "];
for (int i = 0; i < [[tokens lastObject] length];i++) {
    [self.textDocumentProxy deleteBackward];
}

}

3 个答案:

答案 0 :(得分:3)

Swift 1.2解决方案:

extension String {

    var length : Int {
        get{
            return count(self)
        }
    }  
}


func deleteLastWord() {

        if let textArray:[String]? = proxy.documentContextBeforeInput?.componentsSeparatedByString(" "){
        if let validArray = textArray{
            for var i=0; i<validArray.last!.length; i++ {
                            proxy.deleteBackward()
                        }
                }
        }
}

答案 1 :(得分:0)

我也在寻找这个问题的答案。 直到现在,我必须使用for循环逐字母删除。

答案 2 :(得分:0)

可能最好和唯一的下注是逐字逐句char,直到你的&#34; word&#34;已被删除。

而不是依赖&#34;空格&#34;我会尝试枚举像这样的子串中的字符串:

[string enumerateSubstringsInRange:NSMakeRange(0, string.length) options:NSStringEnumerationByWords | NSStringEnumerationLocalized usingBlock:^(NSString * _Nullable substring, NSRange substringRange, NSRange enclosingRange, BOOL * _Nonnull stop) {
    // Do whatever you want with the words (substrings)
    [words addObject:@[substring, [NSValue valueWithRange:substringRange]]];
}];

然后向后删除您找到的范围内的相应字符数。

来自Apple的官方文档:

  

使用UITextDocumentProxy时,您将没有简单的方法来删除范围,子字符串或其他任何可能让您的生活更方便的文本。只需编写自己的方法!快乐的编码!

..大声笑