Usando NSFontPanel em Cocoa
-
06-07-2019 - |
Pergunta
Eu estou tentando usar um NSFontPanel para permitir que o usuário para alterar uma configuração de fonte de toda a aplicação. É suposto trabalho algo como isto:. O usuário clica em um botão, um painel da fonte aparece, eles escolhem uma fonte e um tamanho, e sua seleção é mantido
Os seguintes mostra o código do painel:
- (IBAction)showFontMenu:(id)sender {
NSFontManager *fontManager = [NSFontManager sharedFontManager];
[fontManager setDelegate:self];
NSFontPanel *fontPanel = [fontManager fontPanel:YES];
[fontPanel makeKeyAndOrderFront:sender];
}
A documentação parece sugerir que o changeFont: (id) método remetente deve ser chamado quando a fonte muda; isso não está acontecendo no meu caso.
- (void)changeFont:(id)sender {
// blah
}
Algumas ideias sobre o que eu poderia estar fazendo errado?
Solução
O objeto que você definiu -changeFont:
na obrigação do socorrista ou acima dele na cadeia de responder. Você não especificou onde você definiu o método, mas eu suponho que é em um objeto controlador que não está na cadeia de responder.
Outras dicas
incluem o seguinte:
[fontManager setTarget:self];
delegado do NSFontManager
existe principalmente para filtrar as fontes que fornece ao painel de fonte via -fontManager:willIncludeFont:
.
Como kperryua menciona, -changeFont:
é enviado para a cadeia de resposta. O botão que ativa o menu de fontes ou seu ponto de vista delimitador pode ser um bom lugar para colocar uma resposta para -changeFont:
.
Você pode encontrar o Fonte de tratamento guia marginalmente mais útil do que o Painel Font guia.
O problema central é esta linha:
[fontPanel makeKeyAndOrderFront:sender];
Ao fazer o painel de fonte da janela de chave, ele tem nenhuma idéia para onde enviar mensagens de ação como -changeFont:. A
Aqui está minha implementação de trabalho. ponto-chave é que você deve fazer o seu objeto como o socorrista onde você implementou - (void)changeFont:(id)sender
NSFontManager *fontManager = [NSFontManager sharedFontManager];
NSFontPanel *panel = [fontManager fontPanel:YES];
[[self window] makeFirstResponder:self];
[panel orderFront:self];
Simples changeFont: implementação de Referência - Fonte de tratamento
-(void) changeFont:(id)sender
{
//Here sender would be NSFontManager
NSFont *oldFont = [self font];
NSFont *newFont = [sender convertFont:oldFont];
[self setFont:newFont];
}