如何在UITextField上模拟删除键?

Mid*_*ori 7 iphone cocoa-touch uitextfield ipad

我正在iPad上创建一个应用程序.我创建使用自定义键盘UITextFieldinputView财产.要在光标位置插入文本,我使用复制和粘贴方法(http://dev.ragfield.com/2009/09/insert-text-at-current-cursor-location.html),它可以正常工作.现在,我想创建删除键.我正在使用的代码是:

if (textField.text.length > 0) {
    textField.text = [textField.text substringToIndex:textField.text.length-1];
}
Run Code Online (Sandbox Code Playgroud)

但是,正如您所知,它只会删除最后一个字符,无论光标位于何处.有谁知道更好的解决方案?

非常感谢你!

Gol*_*Joe 14

打电话吧[textField deleteBackward].它会照顾光标位置并为您突出显示.


zel*_*elk 5

我懂了!这是该shouldChangeCharactersInRange方法的委托方法实现.


- (BOOL) textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange) range replacementString:(NSString *) string {
    if ([string isEqualToString:@"?"]) {
        // NSLog(@"Backspace Pressed");
        NSMutableString *text = [textField.text mutableCopy];
        // NSLog(@"Length: %d Location: %d", range.length, range.location);
        if (range.length > 0) {
            [text deleteCharactersInRange:range];
        }
        if (range.length == 0 && range.location != 0) {
            NSRange backward = NSMakeRange(range.location - 1, 1);
            // NSLog(@"Length: %d Location: %d", backward.length, backward.location);
            [text deleteCharactersInRange:backward];
        }
        // NSLog(@"%@", text);
        textField.text = text;
        return NO;
    } else {return YES;}
}
Run Code Online (Sandbox Code Playgroud)

它与UIPasteboard方法一起用于将文本输入到a中UITextField,这意味着您必须将删除键链接到将任意unicode字符粘贴到文本字段(例如?)中的方法,以及调用委托方法时,您认识到替换字符串是该特定字符.

range如果存在活动选择,则从那里删除textField文本的可变字符串中的字符,或者如果没有选择,则从区域中抓取前一个字符,只是插入符号.


小智 5

迟到了(再一次; - )...与iOS 5,UITextField符合UITextInput协议,它扩展了UITextField与一些有用的方法和属性,包括selectedTextRange属性,它是相当于selectedRangeUITextView.


Tom*_*m S 2

考虑切换到 a UITextView,它有一个selectedRange属性,用于获取当前选定的字符范围或光标位置(如果未选择任何内容)。不幸的是,UITextField没有这个方法,而且我还没有找到另一种方法来查找光标位置。

该属性的文档可以在 Apple 网站上selectedRange找到。它由一个 组成,其中是光标位置,是所选字符的数量(如果未选择任何字符,则为零。)您的代码必须如下所示:NSRangeselectedRange.locationselectedRange.length

textView.text = [textView.text stringByReplacingCharactersInRange:textView.selectedRange withString:@""];
Run Code Online (Sandbox Code Playgroud)