1

アプリのサインアップページがあります。ユーザーは、アプリで使用するセル番号と4桁のPINを入力するように求められます。セル形式の標準化に役立つ3つのセルフィールドがあります。最初のフィールドは3桁で市外局番を保持し、2番目のフィールドも3桁で、最後のフィールドは4桁です。次にPINフィールドが表示されます。ユーザーが特定のボックスに正しい桁数を入力したときに、次のフィールドをアクティブにしたい。たとえば、誰かが市外局番の3桁を入力すると、カーソルは次のボックスに進むはずです。

入力を続けるとカーソルが移動するように動作するようになりました。ただし、次の数字を入力したにのみ移動します(たとえば、市外局番の3桁を入力してから別の数字を入力すると、その数字がカーソルと一緒に次のボックスに表示されます。入力後、カーソルは移動しません。わずか3桁)。さらに、私が使用している方法には、必要な文字数がすでにある場合にフィールドを編集できないという不具合があるようです。

これは私が現在使用しているコードです:

-(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) {。これにより、コードを追跡し、操作しているtextFieldを特定しやすくなります。

-(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です。これはbecomeに暗黙的に含まれているため、辞任を送信する必要はありません。

YESそして、この方法は最後に答えるはずです。

于 2012-09-15T00:11:12.770 に答える
0

lnafzigerの答えはうまくいきます!迅速な解決策を見つけている人は、ここに私の迅速な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 に答える