Может подчеркивать, но не выделять жирным шрифтом текст в NSTextView

#swift #macos #nstextview #nsdocument #nsresponder

#swift #macos #nstextview #nsdocument #nsresponder

Вопрос:

У меня есть приложение NSDocuments amp; storyboard, созданное с помощью мастера в Xcode 8. В сцене ViewController я добавил NSTextView. Некоторые пункты меню отключены, например, жирный шрифт и курсив.

Глядя на первого респондента, действия для жирного и курсивного шрифта отсутствуют. Должен ли я сам писать эти методы? Связано ли это с неправильной настройкой цепочки ответчиков? Почему отображается подчеркивание, но не жирный шрифт?

Редактировать: добавление изображения, чтобы показать, как я могу редактировать текст с помощью панели инспектора, но в меню Формат не отображаются команды, которые я ожидаю.

Изображение, показывающее, как я могу изменять текст с помощью панели инспектора, но не с помощью меню, кроме подчеркивания

Комментарии:

1. Извините, что вы подразумеваете под «некоторые пункты меню отключены»? Где находятся эти пункты меню?

2. В главном меню приложения, которое создается с помощью мастера. Записи находятся в разделе Формат / шрифт.

3. Глядя на API NSText, кажется, что существует метод подчеркивания, тогда как я полагаю, что выделение текста жирным шрифтом и курсивом потребует изменения семейства шрифтов. Возможно, это так.

4. Похоже, это ошибка в Xcode; Я не вижу никаких причин, по которым это не сработает. Если вы создаете новый пустой проект и отменяете выбор раскадровки, он работает нормально, но если вы сделаете то же самое с раскадровками, вы получите описанное вами поведение: некоторые вещи работают, другие нет. Возможно, это потому, что раскадровка добавляет NSViewController ?

5. Немного не уверен в проблеме, но вы установили для NSTextView значение attribute? AFAIK вы можете использовать только жирный / курсив с простым NSTextView, изменив шрифт, как вы упомянули.

Ответ №1:

Существует историческая (?) Причина этой проблемы. Когда главное меню было создано в xib-файле, xib-файл автоматически содержал экземпляр NSFontManager и к нему были подключены такие пункты меню, как Bold. Однако в современной раскадровке нет предустановленного экземпляра NSFontManager.

Что ж, тогда вы можете подключить их к FontManager вручную, выполнив следующие действия.

  1. Создайте обычный экземпляр объекта (синий куб) в сцене приложения.
  2. Измените класс экземпляра объекта на NSFontManager. введите описание изображения здесь
  3. Подключите пункты меню к addFontTrait(_:) действию FontManager. Аналогично, соедините «Большие» и «Меньшие» элементы с modifyFont(_:) . введите описание изображения здесь

Вам также необходимо установить тег MenuItems, однако на самом деле они уже установлены. Установите соответствующий тег также вручную, только если тег MenuItem равен 0 .

Комментарии:

1. Отличное объяснение, даже с картинками. Большое спасибо.

2. О, нашел это здесь developer.apple.com/library/content/documentation/TextFonts/… и здесь developer.apple.com/library/content/documentation/TextFonts/…

Ответ №2:

Если вы перетаскиваете ctrl из пункта меню в первый ответчик, в режиме меню вы получаете те же параметры, просто щелкаете ctrl. Затем вы реализуете любую функцию, которую вы только что подключили. Если вы подключите File> New к newDocument и реализуете в своем ViewController

 func newDocument(_ sender: Any?){
    print("func newDocument(_ sender: Any? (String(describing: sender)))")
}
 

Он будет вызван. Первый ответчик перечисляет все те же методы, что и добавленный объект с NSFontManager в качестве класса. Я не использую @IBAction перед методом, потому что я его не подключаю.