33

誰でもこれを手伝ってもらえますか:UITextField入力番号を実装する必要があります。この数値は、12.3456 または 12.3400 のように常に 4 桁の 10 進数形式である必要があります。そこでNSNumberFormatter、小数点以下の桁数に役立つものを作成しました。

UITextField値を設定しています

-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 方法。入力を処理し、フォーマッタを使用して、最後に呼び出します[textField setText: myFormattedValue];

これは正常に機能しますが、この呼び出しはカーソルをフィールドの最後に移動します。それは望ましくありません。たとえば、フィールドに 12.3400 があり、カーソルが一番最初にあり、ユーザーが 1 を入力します。結果の値は 112.3400 ですが、カーソルは最後に移動します。ユーザーが期待するときにカーソルで終了したい(最近追加された番号1の直後)。カーソルの設定に関するトピックがいくつかありますがTextView、これはUITextField. selectedTextRangeまた、カーソル位置を適切に保存するフィールドをキャッチしようとしましたが、setTextメソッド呼び出しの後、これは自動的に変更され、原点UITextRangeが失われます (現在に変更されます)。うまくいけば、私の説明は明確です。

これで私を助けてください。どうもありがとうございます。

EDIT:最後に、編集全体の後に機能をフォーマットの変更に切り替えることにしましたが、十分に機能します。セレクターを追加することでそれを行いましたforControlEvents:UIControlEventEditingDidEnd

4

6 に答える 6

41

プロパティが変更された後、テキスト プロパティを設定した後、古いテキストに関連付けられていたUITextField.text以前の参照UITextPositionまたはオブジェクトは nil に設定されます。UITextRangeテキストプロパティを設定する前に、操作後にテキストオフセットがどうなるかを保存する必要があります。

これは私にとってはうまくいきました(以下の例で t から文字を削除した場合、cursorOffset が < textField.text.length であるかどうかをテストする必要があることに注意してください):

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

{
    UITextPosition *beginning = textField.beginningOfDocument;
    UITextPosition *start = [textField positionFromPosition:beginning offset:range.location];
    UITextPosition *end = [textField positionFromPosition:start offset:range.length];
    UITextRange *textRange = [textField textRangeFromPosition:start toPosition:end];

    // this will be the new cursor location after insert/paste/typing
    NSInteger cursorOffset = [textField offsetFromPosition:beginning toPosition:start] + string.length; 

    // now apply the text changes that were typed or pasted in to the text field
    [textField replaceRange:textRange withText:string];

    // now go modify the text in interesting ways doing our post processing of what was typed...
    NSMutableString *t = [textField.text mutableCopy];
    t = [t upperCaseString];
    // ... etc

    // now update the text field and reposition the cursor afterwards
    textField.text = t;
    UITextPosition *newCursorPosition = [textField positionFromPosition:textField.beginningOfDocument offset:cursorOffset];
    UITextRange *newSelectedRange = [textField textRangeFromPosition:newCursorPosition toPosition:newCursorPosition];
    [textField setSelectedTextRange:newSelectedRange];

    return NO;
}
于 2013-02-09T23:37:09.353 に答える
5

そして、ここに迅速なバージョンがあります:

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
    let beginning = textField.beginningOfDocument
    let start = textField.positionFromPosition(beginning, offset:range.location)
    let end = textField.positionFromPosition(start!, offset:range.length)
    let textRange = textField.textRangeFromPosition(start!, toPosition:end!)
    let cursorOffset = textField.offsetFromPosition(beginning, toPosition:start!) + string.characters.count

// just used same text, use whatever you want :)
    textField.text = (textField.text! as NSString).stringByReplacingCharactersInRange(range, withString: string)

    let newCursorPosition = textField.positionFromPosition(textField.beginningOfDocument, offset:cursorOffset)
    let newSelectedRange = textField.textRangeFromPosition(newCursorPosition!, toPosition:newCursorPosition!)
    textField.selectedTextRange = newSelectedRange

    return false
}
于 2015-11-25T15:44:54.927 に答える
4

これがSwift 3バージョンです

extension UITextField {
    func setCursor(position: Int) {
        let position = self.position(from: beginningOfDocument, offset: position)!
        selectedTextRange = textRange(from: position, to: position)
    }
}
于 2016-12-07T17:12:44.250 に答える
2

この回答で説明されているコードを実装します:カーソルを UITextField の先頭に移動する

NSRange beginningRange = NSMakeRange(0, 0);
NSRange currentRange = [textField selectedRange];
if(!NSEqualRanges(beginningRange, currentRange))
{
    [textField setSelectedRange:beginningRange];
}

編集:この回答から、iOS 5 以降を使用している場合は、このコードを UITextField で使用できるようです。それ以外の場合は、代わりに UITextView を使用する必要があります。

于 2012-06-22T14:54:09.163 に答える