ligações de cacau: combinar itens fixos com ArrayController obrigado itens em um NSPopupButton
-
12-09-2019 - |
Pergunta
Eu estou tentando fazer um seletor de cor através de um NSPopupButton, e no fundo eu gostaria de um separador e um "... Personalizado" opção. É possível carregar as cores da matriz, em seguida, orçada o separador e "custom" item no fundo? se sim, como?
Obrigado!
Solução
Você realmente deve usar um NSColorWell em vez de mão-elaborar o seu próprio. Uma das razões por que a Apple tem GUIs superiores do que outras plataformas (especialmente Linux) é porque os desenvolvedores usam os componentes padrão para fazer esse tipo de coisa. Argumentos como 'porque eu acho que torna a interface mais conciso' são as razões pelas quais GIMP é um exemplo tão perfeito de como não projetar uma GUI.
Dito isso, basicamente, o que você está tentando fazer é definir um menu dinâmico, em vez de uma lista de tamanho fixo (como se poderia fazer em InterfaceBuilder). Você pode fazer isso através das aulas NSMenu e NSMenuItem.
O que você precisa fazer, é ao invés de exibição no menu on-demand, é preenchê-lo quando o aplicativo é iniciado com o conjunto padrão. Então, quando as mudanças de matriz (via seus objetos de modelo) acionar a re-criação do menu. Alternativamente, armadilha o menu com o menuNeedsUpdate:. Mensagem
Outras dicas
Eu criei um PopUpButton semelhante, mas ainda não estou ligando as cores padrão para uma matriz fixa (embora eu estou trabalhando nisso agora). há duas appraoches aqui - ambos podem ser considerados hacks pelos puristas, mas eles fazer o trabalho
.-
subclasse o NSPopUpButtonCell e attachPopUpWithFrame substituição para adicionar seus próprios itens de menu. Eu não tentei este itens ao lado vinculados.
-
Hard-código '.. Custom' objeto em sua matriz, e têm a ação do painel de cores exibida, adicionar um novo item à matriz.
Isso é possível com ligações a partir de Mac OS X 10.5 usando a tag "colocação de conteúdo"; veja a minha resposta aqui:
Não usar ligações, não. Você poderia fazer o “Custom ...” one facilmente suficiente, mas não o separador.
Por que não usar um NSColorWell, afinal?
- configurar seu ligações no
NSPopupButton
como de costume - Na sua configuração de ligações para o
NSPopupButton
, defina o valorContent Placement Tag
para1
- No Storyboard, expanda o NSPopupButton e selecionar o NSMenu associado ao
NSPopupButton
-
Certifique-se de que você tem dois itens em seu menu:
Opcional: Adicionar um item de menu separador entre dinâmica e conteúdo estático:
- Defina o seu
ViewController
como delegado para o NSMenu -
Faça o seu o seu
ViewController
umNSMenuDelegate
e adicione o seguinte código em seuViewController
:extension YourViewController: NSMenuDelegate { func menuNeedsUpdate(_ menu: NSMenu) { menu.insertItem(NSMenuItem.separator(), at: menu.numberOfItems-1) } }
que simplesmente corretamente inserir um separador entre o seu conteúdo dinâmico e sua estática "Custom ..." item de menu