Наложение NSTextView вызывает странности со статусом первого респондента

У меня NSTextView в NSScrollView, и я программно вставляю подкласс NSView как подпредставление NSTextView. Этот NSView действует как наложение, накладывая графическую информацию о тексте под ним.

Я думал, что это работает достаточно хорошо, пока не заметил, что текстовое представление не реагирует на щелчки правой кнопкой мыши. Другие операции (редактирование, выделение) работают нормально.

Кроме того, если первый респондент изменен на родственника представления прокрутки (например, представление структуры), текстовое представление не восстанавливает статус первого респондента после щелчка по нему. Выбор изменится в ответ на щелчок, но выделение выделения будет серым, а не синим (что указывает на то, что текстовое представление не является первым респондентом).

Если я смещу фрейм наложения subview, текстовое представление ведет себя на 100% нормально в области, не перекрытой наложением, но перекрывающаяся область ведет себя неправильно, как описано выше.

Действия по воспроизведению этого поведения в Mac OS X 10.6.4:

  1. Создайте простое старое приложение Какао, не основанное на документах.
  2. Добавьте IBOutlet NSTextView в делегат приложения .h.
  3. Добавьте NSTextView в окно в MainMenu.xib. Подключите розетку textView.
  4. Введите немного кода:

In applicationDidFinishLaunching:

NSView *overlay = [[NSView alloc] initWithFrame:textView.bounds];
[textView addSubview:overlay];
[overlay release];

Запустите приложение и обратите внимание, что щелчок правой кнопкой мыши в текстовой области не работает должным образом, но вы все равно можете взаимодействовать с текстовым представлением.

Затем добавьте NSOutlineView в окно в xib. Обратите внимание, что как только фокус покидает текстовую область (если вы щелкнете по представлению структуры) с наложением, вы не сможете вернуть фокус обратно к текстовому представлению (он больше не станет первым респондентом).


Есть ли способ разрешить NSTextView получать все свои события, даже если мой NSView оверлей не принимает события первого респондента или мыши? Я подозреваю, что это может быть связано с редактором поля - возможно, он игнорирует события, которые, по его мнению, предназначены для представления наложения?


person Adam Preble    schedule 28.10.2010    source источник
comment
Требуется больше контекста (и, вероятно, кода).   -  person Joshua Nozzi    schedule 28.10.2010
comment
Не могли бы вы более подробно описать то, что вы считаете упущенным?   -  person Adam Preble    schedule 28.10.2010
comment
Оказывается, это очень просто воспроизвести в приложении, созданном с нуля. Я добавил шаги для воспроизведения.   -  person Adam Preble    schedule 29.10.2010


Ответы (3)


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

person Peter Hosey    schedule 30.10.2010

У меня нет большого опыта с этим, но другой возможностью было бы использовать слой Core Animation в качестве наложения.

person JWWalker    schedule 29.10.2010
comment
Цените предложение, однако я особенно заинтересован в том, чтобы реагировать на события мыши и предпочел бы не изобретать колесо в отношении их сопоставления с подслоями и т. Д. - person Adam Preble; 29.10.2010

Чистый способ справиться с этим - сделать ваше оверлейное представление настраиваемым подклассом NSView, а затем переопределить метод hitTest:, чтобы он всегда возвращал nil. Это предотвратит участие оверлея в цепочке респондентов. Вместо этого события будут автоматически отправляться в его супервизор или представления, расположенные выше по иерархии представлений. Вы также можете переопределить acceptFirstResponder, чтобы он возвращал NO в целях безопасности (в случае, если он случайно установлен программно).

person Dalmazio    schedule 14.03.2012