2016-03-02 96 views
1

我有一个文本框,&使用shouldChangeCharactersInRange方法来获取值。NSRange`replaceCharactersInRange`在退格和输入新字符后崩溃的应用程序

这里是我的代码:

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

    NSLog(@"Pressing : %@\n", string); 
    NSMutableString *text = [NSMutableString stringWithString:textField.text]; 

    NSLog(@"length: %lu", (unsigned long)range.length); 
    NSLog(@"location: %lu\n", (unsigned long)range.location); 
    NSLog(@"before text: %@", textField.text); 

    [text replaceCharactersInRange:range withString:string]; 
    NSLog(@"After replacement , Text: %@\n\n", text); 

    // My work.. 

    return YES; 
} 

我先加字符 'T' 到文本框,它工作正常..

2016-03-02 10:06:23.162 MyTextFieldApp[12006:4323645] Pressing : T 
2016-03-02 10:06:23.163 MyTextFieldApp[12006:4323645] length: 0 
2016-03-02 10:06:23.163 MyTextFieldApp[12006:4323645] location: 0 
2016-03-02 10:06:23.163 MyTextFieldApp[12006:4323645] before text: 
2016-03-02 10:06:23.163 MyTextFieldApp[12006:4323645] After replacement , Text: T 

然后,我就退格删除字符,这也适用很好..

2016-03-02 10:06:30.979 MyTextFieldApp[12006:4323645] Pressing : 
2016-03-02 10:06:30.980 MyTextFieldApp[12006:4323645] length: 1 
2016-03-02 10:06:30.980 MyTextFieldApp[12006:4323645] location: 0 
2016-03-02 10:06:30.980 MyTextFieldApp[12006:4323645] before text: T 
2016-03-02 10:06:30.981 MyTextFieldApp[12006:4323645] After replacement , Text: 

但是,当我要添加新字符,然后,它崩溃在replaceString ..

注意:此时间,范围给出长度为0 &位置1,而第一次也当我加入吨至空文本框,它给出一个长度为0以及位置0

2016-03-02 10:07:02.158 MyTextFieldApp[12006:4323645] Pressing : T 
2016-03-02 10:07:02.158 MyTextFieldApp[12006:4323645] length: 0 
2016-03-02 10:07:02.159 MyTextFieldApp[12006:4323645] location: 1 
2016-03-02 10:07:02.159 MyTextFieldApp[12006:4323645] before text: 
2016-03-02 10:07:02.159 MyTextFieldApp[12006:4323645] *** Terminating app due to uncaught exception 'NSRangeException', reason: '-[__NSCFString replaceCharactersInRange:withString:]: Range or index out of bounds' 

我无法检测到问题在哪里?

回答

2

由于您试图在text可变字符串中的无效位置插入数据,您的程序崩溃。

第二次按'T'时,值text(从textField.text检索到)是一个空字符串(字面上为@"")。然后,您拨打传递location的1和length 0.当您拨打时,length的值为0,表明您在位置location处有效地说“插入字符串”。当length大于0时,此函数仅替换文本。

当您的代码尝试在索引1处插入字母'T'时,它不能(空字符串的第一个且仅有的索引为0) ,所以程序崩溃。

另外,对于它的价值,如果textField为空,程序不应该返回1的位置,并且长度为0。必须有其他事情正在进行。我在写斯威夫特您的样本程序,并得到了以下的输出:

import UIKit 

class ViewController: UIViewController { 
    var textField: UITextField! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     view.backgroundColor = UIColor.blackColor() 

     textField = UITextField(frame: CGRectMake(20, 100, 200, 20)) 
     textField.backgroundColor = UIColor.whiteColor() 
     textField.delegate = self 

     view.addSubview(textField) 
    } 
} 


extension ViewController: UITextFieldDelegate { 
    func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool { 
     print("range.length: \(range.length), range.location: \(range.location), text: '\(textField.text!)' string: '\(string)'") 
     return true 
    } 
} 

输出:

range.length: 0, range.location: 0, text: '' string: 'T' // press T 
range.length: 1, range.location: 0, text: 'T' string: '' // press backspace 
range.length: 0, range.location: 0, text: '' string: 'T' // press T 

正如你所看到的,我看到的0,0预期范围上T的第二插件Objective-C程序的行为应该类似。

+0

你明白吗,为什么我要获得位置1?这是我没有得到.. – Simmy

+0

我不知道,你的程序或其他东西是错误的字段中键入。我写了完全相同的程序,只是为了明智地检查UITextField是否做得正确,并且从我的输出中可以看到,我得到的范围都很好。 – par

相关问题