У меня есть NSTextView
в NSScrollView
, и я программно вставляю подкласс NSView
в качестве подпредставления NSTextView
. Это NSView
действует как наложение, накладывая графическую информацию о тексте под ним.
Я думал, что это работает довольно хорошо, пока не заметил, что текстовое представление не реагирует на щелчки правой кнопкой мыши. Другие операции (редактирование, выделение) работают нормально.
Кроме того, если первый респондент заменен на одноуровневое представление прокрутки (например, контурное представление), текстовое представление не восстанавливает статус первого респондента после нажатия на него. Выбор изменится в ответ на щелчок, но выделение выделения будет серым, а не синим (что указывает на то, что текстовое представление не является первым респондентом).
Если я смещу рамку вложенного подпредставления, текстовое представление будет вести себя на 100% нормально в области, не перекрываемой наложением, но перекрывающаяся область ведет себя неправильно, как указано выше.
Действия по репликации этого поведения в Mac OS X 10.6.4:
- Создание простого старого бездокументного приложения Какао.
- Добавить IBOutlet NSTextView к делегату приложения .h.
- Добавьте
NSTextView
к окну в MainMenu.xib. Подключите выход textView.
- Введите немного кода:
В applicationDidFinishLaunching:
NSView *overlay = [[NSView alloc] initWithFrame:textView.bounds];
[textView addSubview:overlay];
[overlay release];
Запустите приложение, обратите внимание, что щелчок правой кнопкой мыши в текстовой области не работает должным образом, но вы все равно можете взаимодействовать с текстовым представлением.
Затем добавьте NSOutlineView в окно в xib. Обратите внимание, что после того, как фокус покинет текстовую область (если вы щелкнете на виде структуры) с наложением, вы не сможете снова установить фокус на текстовый вид (он больше не станет первым респондентом).
Можно ли каким-то образом разрешить NSTextView
получать все его события, даже если мой оверлей NSView
не принимает события первого респондента или мыши? Я подозреваю, что это может быть связано с полевым редактором - возможно, он игнорирует события, которые, по его мнению, предназначены для оверлейного представления?