17

UITextField でカーソル位置を制御しようとしています。ユーザーは、テキスト フィールドの中央に一度に複数の文字を挿入することはできません。テキストフィールドの最後に移動します。SOのこの投稿:UITextFieldのカーソル位置を制御するそれは私の問題を解決します。しかし、現在のカーソル位置を知る必要があります。

私のコードは次のようになります。

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
   if (textField.tag == 201) 
   {
     [myclass selectTextForInput:textField atRange:NSMakeRange(idx, 0)];
   }
}

idx でエラーが発生しています。どうすればそれを見つけることができますか?

4

4 に答える 4

27

UITextFieldUITextInput現在の選択を取得するためのメソッドを持つプロトコルに準拠しています。しかし、方法は複雑です。次のようなものが必要です。

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    if (textField.tag == 201) {
        UITextRange *selRange = textField.selectedTextRange;
        UITextPosition *selStartPos = selRange.start;
        NSInteger idx = [textField offsetFromPosition:textField.beginningOfDocument toPosition:selStartPos];

        [myclass selectTextForInput:textField atRange:NSMakeRange(idx, 0)];
    }
}
于 2013-05-08T04:04:56.420 に答える
7

迅速なバージョン

if let selectedRange = textField.selectedTextRange {

    let cursorPosition = textField.offsetFromPosition(textField.beginningOfDocument, toPosition: selectedRange.start)
    print("\(cursorPosition)")
}

カーソル位置の取得と設定に関する私の完全な回答はこちらです。

于 2016-01-21T11:24:01.153 に答える
3

投稿したコードは、カーソルがどこにあるかを判断するために機能しません。set ではなく get メソッドが必要です。それは次のようなものでなければなりません:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
   if (textField.tag == 201) 
   {
         UITextRange selectedRange = [textField selectedTextRange];
         // here you will have to check whether the user has actually selected something
         if (selectedRange.empty) {
              // Cursor is at selectedRange.start
              ...
         } else {
              // You have not specified home to handle the situation where the user has selected some text, but you can use the selected range and the textField selectionAffinity to assume cursor is on the left edge of the selected range or the other
              ...
         }
   }
}

詳細については、UITextInput プロトコルhttp://developer.apple.com/library/ios/#documentation/UIKit/Reference/UITextInput_Protocol/Reference/Reference.html#//apple_ref/occ/intf/UITextInputを確認してください。

更新: @rmaddy は、応答で見逃したいくつかの良い追加ビットを投稿しました-NSTextRange からのテキスト位置を処理し、NSTextPosition を int に変換する方法。

于 2013-05-08T04:02:17.563 に答える