Отменить выбор текста в NSTextView программно? - PullRequest
6 голосов
/ 21 ноября 2011

Я использую следующий код для отмены выбора NSTextView, как предложено здесь . К сожалению, ничего не происходит. Я пробовал то, что я знаю, чтобы отладить его, но все, кажется, работает правильно, но это не влияет на NSTextView.

Код:

// Sets the scrolling bounds and behavior. This might be useful, but I don't know
[[textView textContainer] setContainerSize:NSMakeSize(FLT_MAX, FLT_MAX)];
[[textView textContainer] setWidthTracksTextView:FALSE];

// The code for deselecting, beginning by making sure it is actually selected (for testing only, as strange as it is)

[textView setSelectable:TRUE];
[textView setDelegate:self];
[_window makeFirstResponder:textView];

NSText *fieldEditor = [_window fieldEditor:TRUE forObject:textView];
[fieldEditor setSelectedRange:NSMakeRange([[fieldEditor string] length],0)];
[fieldEditor setNeedsDisplay:YES];

Есть идеи, почему это не работает? Я уверен, что мои розетки установлены правильно, потому что я могу манипулировать другими вещами, такими как строковое значение.

Ответы [ 6 ]

8 голосов
/ 21 ноября 2011

Я не уверен, что NSTextViews используют редактор полей. Вы пытались вызвать метод непосредственно в текстовом представлении?

[textView setSelectedRange:NSMakeRange(textView.string.length, 0)];

Положение диапазона можно настроить, например, для перемещения курсора в начало или конец. Вы также можете проверить, действительно ли что-то выбрано перед вызовом этого метода.

EDIT:

Из вашего комментария звучит так, будто вы просто хотите, чтобы он ушел в отставку первым респондентом. Вы можете сделать это вручную, позвонив [textView.window makeFirstResponder:nil];

6 голосов
/ 13 апреля 2012

Это почти сработало для меня;

[textView.window makeFirstResponder:nil];

Однако у меня возникли проблемы с настройкой первого респондента на ноль.Если я установлю его на любой другой вид, он, кажется, будет делать, как вы хотите.

[textView.window makeFirstResponder:[textView superview]];

Протестировано на 10,7 Lion.

2 голосов
/ 31 марта 2015

Как было предложено ранее, setSelectedRange: добьется цели, НО!

Если ваша цель состоит в том, чтобы полностью удалить выделение и курсор тоже, например если вы подкласс NSTextView для поддержки аналогичного поведения, как NSTextEdit в случае firstResponder изменения статуса, вы должны написать:

- (BOOL)resignFirstResponder
{
    // Invalid range location will remove cursor too
    [self setSelectedRange:NSMakeRange(NSUIntegerMax, 0)];  
    return YES;
}
//------------------------------------------------------------------------------

- (BOOL)becomeFirstResponder
{
    [self setSelectedRange:NSMakeRange(0, self.string.length)];
    return YES;
}
//------------------------------------------------------------------------------
2 голосов
/ 23 октября 2013

Я использую этот подход, и он отлично работает:

[textView setSelectedRange:NSMakeRange(0, 0)];
0 голосов
/ 21 ноября 2011

В качестве временного решения, просто до тех пор, пока кто-то не придумает лучшей идеи, можно использовать setHidden:. Я уверен, что это не так эффективно, как рекомендуется, но он отменяет выбор NSTextView.

Просто переключите его дважды, вот так:

[textView setHidden:TRUE];
[textView setHidden:FALSE];
0 голосов
/ 21 ноября 2011
[textView setDelegate:self];

У меня такое чувство, что один из ваших методов делегата предотвращает происходящее.См. документацию в разделе «Управление выбором».

...