私は持っています、UITextView
そして私は2つのボタンが欲しいです。ユーザーが戻るボタンをタップすると、カーソルが1文字戻ります。タップして進むボタンを押すと、カーソルが1文字前に移動します。どうすればこれを行うことができますか?
2 に答える
以下にリンクされている回答を参照して、私はあなたのためにそれを書きました。私が書いたコードを基本的なプロジェクトにドロップして試してみることができます。
解決策のアイデア:
選択するテキストの範囲を指定することにより、プログラムでテキストのブロックを選択できます(リファレンスを参照)。範囲は何ですか、あなたは尋ねますか?基本的には開始位置と長さです。カーソル位置のみを気にするので、長さを無視して(つまり、ゼロのままにして)、「選択範囲」の開始位置を+1または-1で調整できます。
参照:
UITextFieldで特定のテキストブロックを選択できますか?
コードの説明:
以下のコードには、2つのボタン(進むと戻る)と、UITextViewのカーソル位置を変更するそれぞれのターゲットメソッドがあります。tv
これはUITextViewのクラス変数/プロパティであることに注意してください(そのように宣言する必要があります)。
コード:
- (void)viewDidLoad {
[super viewDidLoad];
UIButton *forward = [UIButton buttonWithType:UIButtonTypeRoundedRect];
forward.frame = CGRectMake(20, 20, 100, 50);
[forward setTitle:@"Forward" forState:UIControlStateNormal];
[forward addTarget:self action:@selector(moveForward:) forControlEvents:UIControlEventTouchUpInside];
UIButton *back = [UIButton buttonWithType:UIButtonTypeRoundedRect];
back.frame = CGRectMake(130, 20, 100, 50);
[back setTitle:@"Back" forState:UIControlStateNormal];
[back addTarget:self action:@selector(moveBack:) forControlEvents:UIControlEventTouchUpInside];
tv = [[UITextView alloc] initWithFrame:CGRectMake(20, 120, 280, 100)];
[self.view addSubview:forward];
[self.view addSubview:back];
[self.view addSubview:tv];
}
-(void)moveForward:(id)sender {
UITextRange *selectedRange = [tv selectedTextRange];
// Calculate the new position, - for left and + for right
if (tv.selectedRange.location < tv.text.length) {
UITextPosition *newPosition = [tv positionFromPosition:selectedRange.start offset:1];
UITextRange *newRange = [tv textRangeFromPosition:newPosition toPosition:newPosition];
// Set new range
[tv setSelectedTextRange:newRange];
}
}
-(void)moveBack:(id)sender {
UITextRange *selectedRange = [tv selectedTextRange];
// Calculate the new position, - for left and + for right
if (tv.selectedRange.location > 0) {
UITextPosition *newPosition = [tv positionFromPosition:selectedRange.start offset:-1];
UITextRange *newRange = [tv textRangeFromPosition:newPosition toPosition:newPosition];
// Set new range
[tv setSelectedTextRange:newRange];
}
}
theSelectedRange
で範囲を決定します[theTextView selectedRange];
。オフセットを減算または加算して、のプロパティを
更新します。
選択が行われていない場合(挿入ポイント) 、プロパティはゼロです。
を使用してカーソルを置きます。
新しい範囲がコンテンツの範囲外にないことを確認してください。location
theSelectedRange
length
theTextView.selectedRange = theSelectedRange;
theTextView