2010-05-08 173 views
15

我想不得不偶尔向UITextView文本对象中插入文本。例如,如果用户按下“新段落”按钮,我想插入一个双换行符而不是标准单个换行符。UITextView在textview文本中插入文本

我该怎么办?我是否必须从UITextView中读取字符串,进行变异并写回来?那我怎么知道指针在哪里?

感谢

+0

[与NSUndoManager支持的UITextView替换文本]的可能重复(http://stackoverflow.com/questions/6419823/replacing-text-in-uitextview-with-nsundomanager-support ) – 2012-04-26 21:43:26

回答

30

由于UITextViewtext属性是不可改变的,你必须创建一个新的字符串和文本属性设置为它。的NSString有通过附加参数传递到接收器创建一个新的字符串的实例方法(-stringByAppendingString:):

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

需要处理的事实,这可能不是在字符串的末尾。一些insertStringAtPoint类的函数?什么? – 2010-05-08 01:52:41

+3

找到了!它实际上是insertString:atIndex: – 2010-05-08 01:55:55

+7

您可能希望在更新textView.text之前设置textView.scrollEnabled = NO;这可以防止恼人的滚动到文本视图的末尾 – 2010-09-15 03:09:01

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. 

} 
+0

嗨布莱恩,我在这里有同样的问题,我尝试你的答案,我可以插入文本,但textview插入文本后总是跳到最后一行,你能给我另一种帮助吗? – 2012-05-28 01:52:01

+0

@ R.Dewi,在更改之前设置'textView.scrollEnabled = NO',然后将其更改回来。 – Dustin 2012-08-02 16:47:55

19

UITextview有一个insertText方法,它遵守光标位置。

- (void)insertText:(NSString *)text 

例如:

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

这不是被接受的答案吗?这是正确的做法,而不是诉诸黑客。 – 2015-12-18 17:07:40

+1

@sudo我不知道我上次做了什么错误,但现在它工作了!非常感谢!这节省了我的一天(尤其是因为它尊重光标位置!!!!!!!!!!) – ParkerHalo 2016-03-30 14:15:46

+0

@NYCTechEngineer可能是因为文档很差,继承进一步模糊了事情,除非在某处明确提到,否则很难找到。我终于找到了'insertText'文档(https://developer.apple.com/documentation/uikit/uikeyinput),但没有链接,并且没有提及它。 – 2018-01-04 14:51:56

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

这是一个正确的答案!

光标位置也是正确的。

滚动位置也是正确的。

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

对于雨燕3.0

您可以将文本通过调用UITextView实例的方法insertText

实施例:

textView.insertText("yourText") 
+1

这是一个很好,很干净的选项。谢谢。 – 2017-06-18 13:59:35