实现shouldChangeCharactersInRange方法时,Backspace不工作 - iPhone Dev

Ben*_*all 20 iphone objective-c

问题...我有一串允许的字符"0123456789".如何从键盘中允许退格...当我从下面实现代码时...退格键不再有效......我该如何解决这个问题?

- (BOOL) textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { 

    NSCharacterSet *nonNumberSet = [[NSCharacterSet characterSetWithCharactersInString:@"0123456789."] invertedSet];

    return ([string stringByTrimmingCharactersInSet:nonNumberSet].length > 0);

}
Run Code Online (Sandbox Code Playgroud)

Ben*_*all 22

- (BOOL) textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    NSCharacterSet *nonNumberSet = [[NSCharacterSet characterSetWithCharactersInString:@"0123456789."] invertedSet];

    if (range.length == 1){
        return YES;
    }else{
        return ([string stringByTrimmingCharactersInSet:nonNumberSet].length > 0);
    }


}
Run Code Online (Sandbox Code Playgroud)

  • 而不是`range.length == 1`,检查`[string length] == 0`.否则,您可以选择单个字符并将其替换为非数字字符,并且您不能一次删除或剪切多个字符. (2认同)

jls*_*ker 15

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    if ([string length] == 0) 
        return YES; 

    NSCharacterSet *nonNumberSet = [[NSCharacterSet decimalDigitCharacterSet] invertedSet];
    string = [[string componentsSeparatedByCharactersInSet:nonNumberSet] componentsJoinedByString:@""]; 
    textField.text = [textField.text stringByReplacingCharactersInRange:range withString:string]; 

    return NO; 
}
Run Code Online (Sandbox Code Playgroud)

这应该可以正确地一次删除/剪切多个字符,以及粘贴.更正欢迎.唯一已知的问题是当你在文本字段的中间进行编辑时,光标会被发送到最后(因为它返回NO) - 我想你必须用a UITextView来修复它.