1

我的应用程序有一个注册页面。系统会提示用户输入手机号码和四位 PIN 码以在应用程序中使用。有三个单元格字段有助于单元格格式的标准化——第一个字段是三位数字并保存区号,第二个字段也是三位数字,最后一个字段是四位。接下来是 PIN 字段。当用户在给定框中输入正确的位数时,我希望下一个字段变为活动状态。例如,当有人输入三位数的区号时,光标应前进到下一个框。

我已经让它工作了,这样如果一个人继续打字,光标就会移动。但是,它只在输入下一个数字移动(例如,您输入三个区号,然后输入另一个数字,该数字将与光标一起出现在下一个框中;输入后光标不移动只有三位数字)。此外,我使用的方法似乎有一个小故障,如果字段已经具有所需的字符数,则无法编辑它们。

这是我目前使用的代码:

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

    NSString *newString = [textField.text stringByReplacingCharactersInRange:range withString:string];
    NSUInteger newLength = newString.length;

    if (textField.tag == 3) {
        if (newLength == 4) {
            [cellField2 becomeFirstResponder];
        }
    }
        if (textField.tag == 4) {
            if (newLength == 4) {
                [cellField3 becomeFirstResponder];
            }
        }
            if (textField.tag == 5) {
                if (newLength == 5) {
                    [pinField becomeFirstResponder];
                }
        }
    if (textField.tag == 6) {
        if (newLength == 5) {
            [pinField resignFirstResponder];
        }
    }

    return YES;
}

我感谢任何帮助,谢谢。

ETA:编辑以包含 danh 的代码,我知道这比我所做的更正确。但是,我的光标问题仍然存在。

4

3 回答 3

2

请注意,您不需要使用标签,因为您将它们全部放在插座中,因此您可以使用:if (textField == cellField1) {,甚至更好:if (textField == self.cellField1) {。这也使您更容易跟踪您的代码并识别您正在操作的文本字段。

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

    NSString *newString = [textField.text stringByReplacingCharactersInRange:range withString:string];
    NSUInteger newLength = newString.length;

    if (textField == self.cellField1) {
        if (newLength == 3) {
            [cellField1 setText:newString];
            [cellField2 becomeFirstResponder];
            return NO; // NO because we already updated the text.
        }
    }

    if (textField == self.cellField2) {
        if (newLength == 3) {
            [cellField2 setText:newString];
            [cellField3 becomeFirstResponder];
            return NO;
        }
    }

    if (textField == self.cellField3) {
        if (newLength == 4) {
            [cellField3 setText:newString];
            [pinField becomeFirstResponder];
            return NO;
        }
    }

    if (textField == pinField) {
        if (newLength == 5) {
            [pinField resignFirstResponder];
            return YES;
        }
    }

    return YES;
}
于 2012-09-15T04:55:30.217 回答
1

一些东西:

newLength 需要首先拥有新字符串,这应该可以解决计数问题:

NSString *newString = [textField.text stringByReplacingCharactersInRange:range withString:string];
NSUInteger newLength = newString.length;

接下来,您可以发送becomeFirstResponder. 无需发送辞职,因为它隐含在成为。

YES这种方法应该在最后回答。

于 2012-09-15T00:11:12.770 回答
0

lnafziger 的回答效果很好!那些正在寻找快速解决方案的人,这是我的 swift 2.2 代码。

func textField(textField: UITextField, shouldChangeCharactersInRangerange: NSRange, replacementString string: String)-> Bool 
{

    let newString = ((textField.text)! as NSString).stringByReplacingCharactersInRange(range, withString: string)// Convert text into NSString in order to use 'stringByReplacingCharactersInRange' function

    let newLength = newString.characters.count  // Count the length of 'String' type variable

    if (textField == cellField1) {

        if (newLength == 3) {

            cellField1.text = newString
            cellField2.becomeFirstResponder()
            return false
        }
    }

    if (textField == cellField2) {

        if (newLength == 3) {

            cellField2.text = newString
            cellField3.becomeFirstResponder()
            return false
        }
    }

    if (textField == cellField3) {

        if (newLength == 4) {

            cellField3.text = newString
            pinField.becomeFirstResponder()
            return false
        }
    }

    if (textField == pinField) {

        if (newLength == 5) {

            pinField.resignFirstResponder()
            return true
        }
    }

    return true

}
于 2016-08-08T03:18:56.377 回答