UITextView在文本视图中插入文本

15

我想偶尔往UITextView文本对象中插入文本。例如,如果用户按下“新段落”按钮,我想要插入双倍换行符而不仅仅是标准的单个换行符。

我应该怎么做呢?我需要从UITextView读取字符串、修改它并将其写回吗?那么如何知道指针位置呢?

谢谢


可能是用NSUndoManager支持替换UITextView中的文本的重复问题。 - Bo Persson
6个回答

33

由于UITextViewtext 属性是不可变的,所以您必须创建一个新字符串并将文本属性设置为它。NSString具有一个实例方法 (-stringByAppendingString:),用于通过将参数附加到接收器来创建一个新字符串:

textView.text = [textView.text stringByAppendingString:@"\n\n"];

需要处理的事实是这可能不在字符串的末尾。有类似于insertStringAtPoint的函数吗?什么? - John Smith
4
找到了!实际上是insertString:atIndex:。 - John Smith
9
在更新textView.text之前,您可能希望将textView.scrollEnabled设置为NO,这可以防止文本视图自动滚动到末尾而导致烦恼。 - Ziga Kranjec
1
如果TextView有很多文本,每次都必须复制大量文本,这可能会变得相当慢。将TextView的文本字符串替换为MutableString并在每次插入时进行转换,这样做是否合理? - NHDaly

30

UITextview有一个insertText方法,并且它会尊重光标位置。

- (void)insertText:(NSString *)text

例如:

[myTextView insertText:@"\n\n"];

4
为什么这不是被接受的答案?这是正确的做法,而且没有借助任何技巧。 - NYC Tech Engineer
1
@sudo 我不知道上次我做错了什么,但现在它可以工作了!非常感谢!这救了我的一天(特别是因为它尊重光标位置!!!!!) - ParkerHalo
@NYCTechEngineer 可能是因为文档不够详细,而且继承进一步使事情变得模糊,除非在某个地方明确提到,否则很难找到。我最终找到了 insertText 文档 (https://developer.apple.com/documentation/uikit/uikeyinput),但没有链接指向它,也没有任何提及。 - toraritte

9
这是我实施的方法,看起来非常有效。
- (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.  

}

嗨,Brian,我这里也有同样的问题,我尝试了你的答案,我可以插入文本,但是在插入文本后,TextView总是跳到最后一行,你能再帮我一下吗? - R. Dewi
@R.Dewi,在修改之前设置textView.scrollEnabled=NO,并在修改后将其改回。 - Dustin

7

Swift 3.0版本

您可以通过调用UITextView实例的insertText方法来添加文本。

例如:

textView.insertText("yourText")

1
这是一个非常好的、非常干净的选项。谢谢。 - Chris Amelinckx

3

这是一个正确的答案!

光标位置也是正确的。

滚动位置也是正确的。

- (void) insertString: (NSString *) insertingString intoTextView: (UITextView *) textView
{
    [textView replaceRange:textView.selectedTextRange withText:insertingString];
}

2
- (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
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接