2010-05-08 4 views
15

Я хочу, чтобы иногда вставлять текст в текстовый объект UITextView. Например, если пользователь нажимает кнопку «Новый абзац», я хотел бы вставить двойную новую строку вместо стандартной единственной новой строки.UITextView текст в текстовом виде

Как это сделать? Должен ли я читать строку из UITextView, мутировать ее и записывать обратно? Тогда как я узнаю, где был указатель?

Благодаря

+0

возможно дубликат [замена текста в UITextView с поддержкой NSUndoManager] (http://stackoverflow.com/questions/6419823/replacing-text-in-uitextview-with-nsundomanager-support) –

ответ

30

text Поскольку свойство UITextView неизменно, вы должны создать новую строку и установить свойство текста к нему. NSString имеет метод экземпляра (-stringByAppendingString:) для создания новой строки путем добавления аргумента к приемнику:

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

нужно иметь дело с тем, что это может быть не в конце строки. Некоторая функция insertStringAtPoint? Какие? –

+3

Нашел! на самом деле это insertString: atIndex: –

+7

Возможно, вы захотите установить textView.scrollEnabled = NO перед обновлением textView.text; это предотвращает раздражающую прокрутку до конца текстового вида. –

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

привет Брайан, у меня такая же проблема, я попробую ответить, я могу вставить текст, но текстовое окно всегда вставляется в последнюю строку после вставки текста, не могли бы вы дать мне другую помощь? –

+0

@ R.Dewi, установите 'textView.scrollEnabled = NO' перед изменением и измените его после. – Dustin

19

UITextview имеет метод insertText и соблюдает позицию курсора.

- (void)insertText:(NSString *)text 

, например:

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

Как это не принятый ответ? Это правильный способ сделать это, не прибегая к хакам. –

+1

@sudo Я не знаю, что я сделал неправильно в прошлый раз, когда я попробовал это, но теперь это работает! Большое спасибо! Это спасло мой день (особенно потому, что он уважает позицию курсора !!!!!!!!!!) – ParkerHalo

+0

@NYCTechEngineer, вероятно, потому, что документация плохая, а наследование еще больше затушевывает вещи, и если это явно не упоминается где-то, ее трудно найти. Я наконец нашел документы 'insertText' (https://developer.apple.com/documentation/uikit/uikeyinput), но ссылки на него отсутствуют, и ничего не упоминается. –

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

Для Swift 3.0

Вы можете добавить текст с помощью вызова метода insertText из UITextView Instance.

Пример:

textView.insertText("yourText") 
+1

Это отличный, очень чистый вариант. Благодарю. –

Смежные вопросы