2015-03-03 2 views
0

В текстовое меню, поставляемое системой, отправляется ряд сообщений, таких как changeFont: modifyFont: и addFontTrait: вверх по первой цепочке ответчиков, пока не достигнет NSTextView, например.Меню текста какао и изменение шрифтов в NSOutlineView

Я хотел бы расширить это, чтобы управлять стилями строк в моем NSOutlineView, но я только смог переопределить changeFont: в моем оконном контроллере и перехватить сообщение (возможно, это лучшее место для этого, но оно работает пока) , Это работает для изменения шрифтов, но другие элементы меню, такие как Bold, Bigger, Smaller, которые используют modifyFont: и addFontTrait: никогда не получают вызов в оконном контроллере, поэтому я не могу изменить их поведение для работы над контурным представлением. Интересно, что они отображаются в меню, но только changeFont: вызывается и, как я понимаю, мне нужно получить значение тега из NSMenuItem, который является отправителем методов modifyFont: и addFontTrait :.

Кто-нибудь знает, как реализовать эту функциональность, получив эти другие методы в любом месте? Благодаря!

ответ

1

Это задокументировано в Cocoa Text Architecture Guide: Font Handling – Handling Font Changes. Сообщения -addFontTrait: и -modifyFont: не отправляются по цепочке ответчиков. Они отправляются непосредственно менеджеру шрифтов. Менеджер шрифтов принимает к сведению запрошенные изменения и отправляет -changeFont: в цепочку ответчиков.

Вам необходимо всего лишь реализовать -changeFont:, как и у вас.

Вы не получили тег из пункта меню. Менеджер шрифтов делает это. Это источник информации, которую менеджер шрифтов записывает внутренне.

Ваш метод -changeFont: должен позвонить -convertFont: в диспетчер шрифтов, передав текущий шрифт. Этот метод вернет новый шрифт, измененный в соответствии с записанным запросом на изменение. Вы сделали бы это для всех шрифтов, которые должны быть затронуты. (Например, у вас может быть выбор с несколькими шрифтами в нем.)

Обычно вы не имеете прямого доступа к запрошенным изменениям, таким как «добавить жирный признак» или «сделать шрифт больше».

Вы можете настроить диспетчер шрифтов путем подкласса NSFontManager и передать ваш подкласс +[NSFontManager setFontManagerFactory:] очень рано в начале приложения. В пользовательском диспетчере шрифтов вы можете отдельно отслеживать изменения, запрошенные различными сообщениями о действиях, например -addFontTrait:. Здесь вы проверите tagsender. Затем в своем виде вы можете запросить свойства вашего отправителя -changeFont:, после проверки того, что это экземпляр вашего подкласса, чтобы определить, какие изменения были запрошены.

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

+0

Я пытаюсь реализовать это решение, чтобы увидеть, работает ли оно, но я не могу установить класс с помощью setFontManagerFactory из-за ошибки «Общий экземпляр NSFontManager уже существует. Игнорирование + [NSFontManager setFontPanelFactory:] ... ". Это вызвано из applicationWillFinishLaunching как указано в документах, но меня беспокоит ошибочное сообщение об ошибке, предполагающее, что я вызвал setFontPanelFactory, когда я вызвал setFontManagerFactory. Можете ли вы назвать этот метод в своем коде? Благодаря! – GenericPtr

+0

Вызов setFontManagerFactory перед NSApplicationMain работал для меня, и те методы, которые мне нужны, вызываются сейчас. Я должен уметь выяснить, как получить результаты, которые я хочу сейчас, хотя мне пришлось сделать что-то немного взломанное, чтобы заставить его работать. Благодаря! – GenericPtr

+0

Я вижу то же, что и вы. Проблема в том, что диспетчер шрифтов ссылается от NIB MainMenu. Это должно быть загружено до того, как будут применены любые методы делегирования приложения, такие как '-applicationWillFinishLaunching:', потому что делегат приложения создается в NIB и также установлен в качестве делегата. Вам нужно будет сделать это в 'main()'. –

 Смежные вопросы

  • Нет связанных вопросов^_^