UITextField
変更通知ハンドラー内のテキストを変更して、書式設定を強制しています。これはうまく機能しますが(再入可能性の問題を解決したら)、もう1つの厄介な問題が残ります。ユーザーがカーソルを文字列の末尾以外の場所に移動すると、書式設定の変更によってカーソルが文字列の末尾に移動します。これは、ユーザーが一度に複数の文字をテキスト フィールドの中央に挿入できないことを意味します。のカーソル位置を覚えてからリセットする方法はありますUITextField
か?
7 に答える
非常に多くの抽象化が入力ボックスと位置の計算に関係しているため、UITextField でのカーソル位置の制御は複雑です。しかし、それは確かに可能です。メンバー関数を使用できますsetSelectedTextRange
:
[input setSelectedTextRange:[input textRangeFromPosition:start toPosition:end]];
これは、範囲を取り、その範囲内のテキストを選択する関数です。特定のインデックスにカーソルを置きたい場合は、長さ 0 の範囲を使用します。
+ (void)selectTextForInput:(UITextField *)input atRange:(NSRange)range {
UITextPosition *start = [input positionFromPosition:[input beginningOfDocument]
offset:range.location];
UITextPosition *end = [input positionFromPosition:start
offset:range.length];
[input setSelectedTextRange:[input textRangeFromPosition:start toPosition:end]];
}
たとえば、カーソルをidx
UITextFieldに配置するにはinput
:
[Helpers selectTextForInput:input
atRange:NSMakeRange(idx, 0)];
インデックスに配置するのに便利 (Swift 3)
private func setCursorPosition(input: UITextField, position: Int) {
let position = input.position(from: input.beginningOfDocument, offset: position)!
input.selectedTextRange = input.textRange(from: position, to: position)
}
私はついにこの問題の解決策を見つけました!挿入するテキストをシステム ペーストボードに配置し、現在のカーソル位置に貼り付けることができます。
[myTextField paste:self]
この人のブログで解決策を見つけました:
http://dev.ragfield.com/2009/09/insert-text-at-current-cursor-location.html
貼り付け機能は OS V3.0 固有のものですが、テストしたところ、カスタム キーボードで問題なく動作します。
このソリューションを使用する場合は、おそらくユーザーの既存のクリップボードの内容を保存し、その後すぐに復元する必要があります。
@Chris R. の Swift バージョンは次のとおりです。Swift3 用に更新されています。
private func selectTextForInput(input: UITextField, range: NSRange) {
let start: UITextPosition = input.position(from: input.beginningOfDocument, offset: range.location)!
let end: UITextPosition = input.position(from: start, offset: range.length)!
input.selectedTextRange = input.textRange(from: start, to: end)
}
このカテゴリを自由に使用してUITextField
、カーソル位置を取得および設定してください。
@interface UITextField (CursorPosition)
@property (nonatomic) NSInteger cursorPosition;
@end
–</p>
@implementation UITextField (CursorPosition)
- (NSInteger)cursorPosition
{
UITextRange *selectedRange = self.selectedTextRange;
UITextPosition *textPosition = selectedRange.start;
return [self offsetFromPosition:self.beginningOfDocument toPosition:textPosition];
}
- (void)setCursorPosition:(NSInteger)position
{
UITextPosition *textPosition = [self positionFromPosition:self.beginningOfDocument offset:position];
[self setSelectedTextRange:[self textRangeFromPosition:textPosition toPosition:textPosition]];
}
@end
あなたの特定の場所にカーソルを置く方法はないと思いますUITextField
(非常にトリッキーでタッチイベントをシミュレートしない限り)。代わりに、ユーザーが( で) テキストの編集を終了したときに書式設定を処理しtextFieldShouldEndEditing:
、入力が正しくない場合は、テキスト フィールドの編集が終了しないようにします。