#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 вручную, выполнив следующие действия.
- Создайте обычный экземпляр объекта (синий куб) в сцене приложения.
- Измените класс экземпляра объекта на NSFontManager.
- Подключите пункты меню к
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 перед методом, потому что я его не подключаю.