2010-05-08 169 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