UITextViewテキストオブジェクトにテキストをときどき挿入する必要があります。たとえば、ユーザーが[新しい段落]ボタンを押した場合、標準の単一の改行ではなく、二重の改行を挿入したいとします。
どうすればそのようなことに対処できますか? UITextViewから文字列を読み取り、変更して、書き戻す必要がありますか?次に、ポインタがどこにあるかをどのように知ることができますか?
ありがとう
text
のUITextView
プロパティは不変なので、新しい文字列を作成し、textプロパティをそれに設定する必要があります。 NSStringにはインスタンスメソッド(-stringByAppendingString:
)引数をレシーバーに追加して新しい文字列を作成します。
textView.text = [textView.text stringByAppendingString:@"\n\n"];
UITextviewにはinsertTextメソッドがあり、カーソルの位置が考慮されます。
- (void)insertText:(NSString *)text
例えば:
[myTextView insertText:@"\n\n"];
ここに私がそれをどのように実装したかがあり、それはうまく機能しているようです。
- (void) insertString: (NSString *) insertingString intoTextView: (UITextView *) textView
{
NSRange range = textView.selectedRange;
NSString * firstHalfString = [textView.text substringToIndex:range.location];
NSString * secondHalfString = [textView.text substringFromIndex: range.location];
textView.scrollEnabled = NO; // turn off scrolling or you'll get dizzy ... I promise
textView.text = [NSString stringWithFormat: @"%@%@%@",
firstHalfString,
insertingString,
secondHalfString];
range.location += [insertingString length];
textView.selectedRange = range;
textView.scrollEnabled = YES; // turn scrolling back on.
}
Swift 3.の場合
insertText
InstanceのメソッドUITextView
を呼び出すことにより、テキストを追加できます。
例:
textView.insertText("yourText")
正解です!
カーソル位置も正しいです。
スクロール位置も正しいです。
- (void) insertString: (NSString *) insertingString intoTextView: (UITextView *) textView
{
[textView replaceRange:textView.selectedTextRange withText:insertingString];
}
- (void)insertStringAtCaret:(NSString*)string {
UITextView *textView = self.contentCell.textView;
NSRange selectedRange = textView.selectedRange;
UITextRange *textRange = [textView textRangeFromPosition:textView.selectedTextRange.start toPosition:textView.selectedTextRange.start];
[textView replaceRange:textRange withText:string];
[textView setSelectedRange:NSMakeRange(selectedRange.location + 1, 0)];
self.changesDetected = YES; // i analyze the undo manager in here to enabled/disable my undo/redo buttons
}