iPhone:禁用“双击空格键”。快捷键?

默认情况下,如果您在iPhone或iPad上点击两次空格键,而不是获得“”(两个空格),则会得到“。”(一个句点后跟一个空格)。 有什么办法来禁用代码中的这个快捷方式?

更新:通过UITextInputTraits禁用自动更正不起作用。

更新2:明白了! 看到我的post下面。

我有一个答案基于上面的贵妃给出的答案。

Chaise的方法不允许你按顺序键入两个空格 – 在某些情况下这是不可取的。 这是完全closures自动句点插入的一种方法:

迅速

在委托方法中:

func textView(textView: UITextView, shouldChangeTextInRange range: NSRange, replacementText text: String) -> Bool { //Ensure we're not at the start of the text field and we are inserting text if range.location > 0 && text.characters.count > 0 { let whitespace = NSCharacterSet.whitespaceCharacterSet() let utf16text = text.utf16 let utf16textViewText = textView.text.utf16 let startIndex = utf16text.startIndex let locationIndex = utf16textViewText.startIndex.advancedBy(range.location - 1) //Check if a space follows a space if whitespace.characterIsMember(utf16text[startIndex]) && whitespace.characterIsMember(utf16textViewText[locationIndex]) { //Manually replace the space with your own space, programmatically textView.text = (textView.text as NSString).stringByReplacingCharactersInRange(range, withString: " ") //Make sure you update the text caret to reflect the programmatic change to the text view textView.selectedRange = NSMakeRange(range.location + 1, 0) //Tell UIKit not to insert its space, because you've just inserted your own return false } } return true } 

现在,您可以尽可能快地点击空格键,只插入空格。

Objective-C的

在委托方法中:

 - (BOOL) textView:(UITextView*)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString*)text 

添加下面的代码:

 //Check if a space follows a space if ( (range.location > 0 && [text length] > 0 && [[NSCharacterSet whitespaceCharacterSet] characterIsMember:[text characterAtIndex:0]] && [[NSCharacterSet whitespaceCharacterSet] characterIsMember:[[textView text] characterAtIndex:range.location - 1]]) ) { //Manually replace the space with your own space, programmatically textView.text = [textView.text stringByReplacingCharactersInRange:range withString:@" "]; //Make sure you update the text caret to reflect the programmatic change to the text view textView.selectedRange = NSMakeRange(range.location+1, 0); //Tell Cocoa not to insert its space, because you've just inserted your own return NO; } 

把这个放在你的委托类中:

 - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{ //Check for double space return !(range.location > 0 && [string length] > 0 && [[NSCharacterSet whitespaceCharacterSet] characterIsMember:[string characterAtIndex:0]] && [[NSCharacterSet whitespaceCharacterSet] characterIsMember:[[textField text] characterAtIndex:range.location - 1]]); } 

我发现为UITextView工作的一个更简单的解决scheme如下:

 - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text { if ([text isEqualToString:@". "] && range.length == 1) { NSMutableAttributedString *attributedString = [textView.attributedText mutableCopy]; [attributedString replaceCharactersInRange:range withString:@" "]; textView.attributedText = attributedString; textView.selectedRange = NSMakeRange(range.location + 1, 0); return NO; } return YES; } 

这允许重复input多个空格,并处理归属文本。 我发现它唯一的例子是粘贴一个单一的字符已经选定的时间和空间。

另一个版本的simeon张贴(这是一个版本的躺椅)。 这个与文本字段( UITextField )一起工作。 你将不得不设置UITextFieldDelegate为此做任何事情。 我注意到更新脱字符的路线,但似乎仍然有效。

 - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)text { //Check if a space follows a space if ( (range.location > 0 && [text length] > 0 && [[NSCharacterSet whitespaceCharacterSet] characterIsMember:[text characterAtIndex:0]] && [[NSCharacterSet whitespaceCharacterSet] characterIsMember:[[textField text] characterAtIndex:range.location - 1]]) ) { //Manually replace the space with your own space, programmatically textField.text = [textField.text stringByReplacingCharactersInRange:range withString:@" "]; //Make sure you update the text caret to reflect the programmatic change to the text view // textField.selectedTextRange = NSMakeRange(range.location+1, 0); //Tell Cocoa not to insert its space, because you've just inserted your own return NO; } return YES; } 

我不认为有一种方法可以closures这个,但看看UITextInputTraits 。 这可以让你声明你的字段的属性,例如你可以说是否input一个URL。 这会影响键盘的行为。 如果你不希望双空间来产生一段时间和空间的原因是文本应该是字面上由于某种原因input的用户,也许你想closures自动更正。 有可能closures自动纠错closures双倍空间的时间,我不知道。

好的,我明白了。 在你的UITextView委托中,添加这个:

 -(BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text { if([text isEqualToString:@". "]) return NO; }