UITextView setSelectedRange изменяет редактируемое свойство - PullRequest
0 голосов
/ 22 марта 2011

С самого начала мой UITextView с редактируемым свойством true не может быть изменен (через настройки в NIB).Поведение таково, что пользователь может выбирать и копировать текст, но не редактировать.Так и должно быть.

Однако, если я сделаю вызов setSelectedRange, побочным эффектом будет то, что свойство editable установлено в YES.

При установке значения NO [textview setEditable:NO] прокручивается в конец textView и отменяет мой программный выбор.Это также не работает, так как редактирование становится доступным в любом случае.Появляется клавиатура и все.

Мне нужно иметь возможность выбирать что-то программно и держать textView в состоянии, когда пользователи могут только копировать и выбирать текст.

[textView select:self];
[textView setSelectedRange:selectedText];

Я застрял,Нужен любой совет, который вы можете дать.

Это не работает:

[textView select:self];
[textView setSelectedRange:selectedText];
[textView setEditable:NO];

Я также пытался настроить функцию делегата textViewShouldBeginEditing для возврата NO:

- (BOOL)textViewShouldBeginEditing:(UITextView *)textView {
    return NO;
}

Это просто блокирует все, и я не могу выделить текст.

Ответы [ 3 ]

1 голос
/ 30 марта 2012

Я понимаю, что на этот вопрос уже был дан ответ, но я сделал улучшение, чтобы сохранить всплывающее меню, просто отключив определенные опции;

-(BOOL) canPerformAction:(SEL)action withSender:(id)sender {
    bool response = [super canPerformAction:action withSender:sender];
    if(response && (action == @selector(cut:) || action == @selector(paste:) || action == @selector(delete:) || action == @selector(_promptForReplace:))) {
        return NO;
    }
    return response;
}

canPerformAction вызывается для каждого определенного действия.Вызов родительского метода позаботится о большинстве этих случаев, но я также решил отключить предложения по вырезанию, вставке, удалению и правописанию (_promptForReplace).

0 голосов
/ 24 марта 2011

TextView должен быть редактируемым:

[textView setEditable:YES];

Сделайте выбор:

[textView select:self];
[textView setSelectedRange:range];

Имейте это в делегате:

Чтобы отключить меню (не идеально для меня, но это нормально):

-(BOOL)canPerformAction:(SEL)action withSender:(id)sender
{    
    [UIMenuController sharedMenuController].menuVisible = NO;
    return NO;    
}

Чтобы отключить клавиатуру:

textView.inputView = [[[UIView alloc] initWithFrame:CGRectZero] autorelease];

Чтобы отключить редактирование:

- (BOOL)textView:(UITextView*)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString*)text {
    return NO;
}
0 голосов
/ 24 марта 2011

Мне кажется, что это работает в похожей ситуации:

  • просто дайте текстовому редактору редактироваться
  • [textView setDelegate:self];
  • [textView select:self];
  • [textView setSelectedRange:range];
  • добавить функцию (BOOL)textView:shouldChangeTextInRange:replacementText:, возвращающую NO
  • и последний трюк: назначить пустой вид в качестве клавиатуры для просмотра текста, используя:

textView.inputView = [[[UIView alloc] initWithFrame:CGRectZero] autorelease];

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...