NSCollectionViewItem за NSTextField

У меня есть NSTextField в представлении NSCollectionViewItem.

Когда вы нажимаете NSCollectionViewItem, элемент выбирается.

Когда вы нажимаете NSTextField, он получает фокус, но NSCollectionViewItem, который находится за текстовым полем, не выделяется.

Я хочу изменить это последнее поведение, чтобы текстовое поле получило фокус, а элемент представления также был выбран.

Как лучше всего это сделать?


person Richard Garside    schedule 24.02.2012    source источник
comment
Извините, я не могу вспомнить это сейчас, но есть специальная настройка для представления (включая TextField), чтобы быть прозрачным для событий мыши и передавать их вверх по цепочке респондентов, ВО ВРЕМЯ их обработки. Только не могу вспомнить точную настройку для этого.   -  person Motti Shneor    schedule 18.06.2014


Ответы (2)


Я полагаю, вам придется создать подкласс NSTextField и переопределить mouseDown, чтобы передать событие в nextResponder (который должен быть установлен в представление вашей коллекции)

person dbrajkovic    schedule 24.02.2012
comment
Это меня больше всего достало. Вам нужно переопределить mouseDown, и я не смог найти способ заставить оба реагировать на событие. Поэтому я решил использовать командную клавишу, чтобы решить, передать ли событие nextResponder или исходному событию mouseDown текстового поля. Если я звонил обоим, было странное поведение. - person Richard Garside; 26.02.2012

У меня также есть NSCollectionViewItem, который содержит NSTextField. Я пытаюсь воссоздать основной внешний вид текстовой метки значка в Finder. Я еще не закончил его, но то, что у меня есть, кажется, отвечает на этот вопрос.

Ключ в том, чтобы текстовое поле начиналось как НЕ выбираемое. Щелчок мышью по текстовому полю будет игнорироваться текстовым полем и выберет элемент представления коллекции. Затем в методе setSelection элемента представления коллекции, когда он выбирается, установите текстовое поле как редактируемое. Следующий щелчок мыши по текстовому полю переведет его в фокус. Затем, когда элемент представления коллекции не выбран, установите для текстового поля значение «недоступно для выбора» и подождите, пока элемент представления коллекции не будет выбран снова.

-(void)awakeFromNib
{
    [self.textField setSelectable:NO];
}

-(void)setSelected:(BOOL)selected
{
    [super setSelected:selected];

    if (self.selected)
    {
        [self.textField setEditable:YES];
    }
    else
    {
        [self.textField setSelectable:NO];
    }
}

Это отвечает на поставленный выше вопрос, но, очевидно, для полного решения требуется больше.

person Chuck H    schedule 20.03.2013