10

私は今朝ずっとこれに対する解決策を探しましたが、うまくいくものをまだ見つけていません。

ユーザーが変更できないようにする既存の固定テキストを含むテキストビューがあります。この場合、各テキストビューは「1.」、「2。」などで始まります。入力したテキストには、後で行うことのために番号が付けられます。

ユーザーがこのテキストを削除できないようにします(基本的に「永続的」です)。また、このプレテキストの途中にテキストを追加し始めることを許可したくありません。

これを処理するために、私は次のことを行いました。

-(BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text 
{
    if (range.location < 3) return NO;

    return YES;
}

これはうまく機能しますが、ユーザーがビューの「1.」、「2。」などの部分に触れると、そこにカーソルが設定され、範囲の場所が原因でユーザーがテキストを入力できなくなります。小切手。この場合に実行したいのは、カーソル(おそらくtextViewDidBeginEditing内)をビュー内のテキストの最後に設定することです。ただし、使用するselectedRangeの組み合わせに関係なく、ダーンカーソルを最後に移動させることはできません。どんな助けでも大歓迎です。

4

6 に答える 6

12

カーソルを最後に移動するには

textView.selectedRange = NSMakeRange([textView.text length], 0);

または、カーソルを3番目の文字の後に移動します

textView.selectedRange = NSMakeRange(3, 0);

もう1つの、おそらくより良いアプローチは、ユーザーが編集を開始したときに最初の3文字をクリアし、編集が終了したらそれらを追加し直すことです。

于 2012-05-25T15:18:30.620 に答える
10

遅いですが、いくつかのブログでこれに対する実用的な解決策を見つけました。少しハックする必要があります

- (void) textViewDidBeginEditing:(UITextView*)textview
{
   [self performSelector:@selector(placeCursorAtEnd:) withObject:textview afterDelay:0.01];
}

- (void)placeCursorAtEnd:(UITextView *)textview
{
     NSUInteger length = textview.text.length;

    textview.selectedRange = NSMakeRange(length, 0);
}
于 2015-06-09T08:44:01.357 に答える
5

に登録することを検討しUIKeyboardWillShowNotification、通知を受け取ったら、textviewをに設定userInteractionEnabledNOます。

また、文字列と等しい場合はテキストを変更しないように(ユーザーがバックスペースをタップしていることを意味する) 、shouldChangeTextInRangeメソッドを実装します。ユーザーがテキストの編集を終了し、そこに移動したら、ユーザーの操作を復元します。replacementText@""@""

幸運を!

于 2012-05-25T15:12:00.810 に答える
3

私は通貨フィールドを作ろうとしていました。ユーザーがフィールド全体を押して、フォーマットされたテキストを削除する可能性があることを望んでいませんでした。最後にカーソルを保持するために私が見つけた最も簡単な方法は、UITextFieldのサブクラスで次のことを行うことです。

-(void) setSelectedTextRange:(UITextRange *)selectedTextRange{

    [super setSelectedTextRange:selectedTextRange];
    self.text = self.text;
}
于 2013-07-27T22:10:42.190 に答える
1
extension UITextView {
    func moveCoursoreToEnd(){
        selectedTextRange = textRange(from:endOfDocument, to: endOfDocument)
    }
}
于 2020-12-16T18:33:28.530 に答える
0

この方法では、オートコレクトとキーボードがジャンプしないように非表示になります。

- (void)rejectAutoCorrectSuggestionInTextView:(UITextView *)textView
{
    if ([textView isFirstResponder])
    {
        NSString *original = textView.text;
        NSRange originalRange = textView.selectedRange;
        CGPoint originalOffset = textView.contentOffset;

        [UIView animateWithDuration:.00001 animations:^{
            textView.text = [textView.text stringByAppendingString:@"|"];
            NSRange range;
            range.location = textView.text.length-1;
            range.length = 0;
            textView.selectedRange = range;
            textView.text = [textView.text substringToIndex:textView.text.length - 1];
        }];

        NSString *final = textView.text;

        if (![original isEqualToString:final])
        {
            textView.text = original;
            textView.selectedRange = originalRange;
            [textView setContentOffset:originalOffset animated:NO];
        }
    }
}
于 2015-04-07T09:41:31.677 に答える