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!

Foi útil?

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.

guia documentação menulist

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

.
  1. subclasse o NSPopUpButtonCell e attachPopUpWithFrame substituição para adicionar seus próprios itens de menu. Eu não tentei este itens ao lado vinculados.

  2. 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:

item de Separator em NSPopupButton com ligações

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?

  1. configurar seu ligações no NSPopupButton como de costume
  2. Na sua configuração de ligações para o NSPopupButton, defina o valor Content Placement Tag para 1

Tag Colocação de conteúdo para o conteúdo dinâmico

  1. No Storyboard, expanda o NSPopupButton e selecionar o NSMenu associado ao NSPopupButton
  2. Certifique-se de que você tem dois itens em seu menu:

    • Primeiro item que vai "representar" o conteúdo dinâmico. Defina o valor tag para 1 -> isso é importante para as ligações de conteúdo dinâmico a ser inseridas no lugar certo. item de menu para receber o tag right
    • Segundo item será o seu "Custom ..." item de menu

Opcional: Adicionar um item de menu separador entre dinâmica e conteúdo estático:

  1. Defina o seu ViewController como delegado para o NSMenu
  2. Faça o seu o seu ViewController um NSMenuDelegate e adicione o seguinte código em seu ViewController:

    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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top