Pergunta

Say Eu tenho a seguinte matriz de dicionários:

{
    {
        isoName => en,
        fullName => English,
        localName => English
    },
    {
        isoName => de,
        fullName => German,
        localName => Deutsch
    },
    {
        isoName => fr,
        fullName => French,
        localName => français
    }
}

Como posso vincular os valores fullName aos valores de um controle NSPopupButton mas ligam isoName da seleção para NSUserDefaults? Eu tenho um NSArrayController configurado com uma matriz como a acima, e meu NSPopupButton é obrigado a este controlador com o caminho da chave modelo como "fullName", mas eu quero manter o isoName nas NSUserDefaults. Isso é possível? Existe uma melhor maneira de abordar isso?

Foi útil?

Solução

Em primeiro lugar, criar uma classe de modelo de objeto que representa um idioma e fazer esses pares propriedades dicionário dos objetos do modelo. Dicionários não funcionam bem com ligações, na minha experiência; o sistema de vinculações quer objetos do modelo real.

Em seguida, crie um objeto controlador para manter estes modelo objetos. Eu vou chamá-lo LanguageKeeper. Ele tem três propriedades:

  • languages (NSArray de Língua objetos)
  • selectedLanguage
  • selectedLanguageISOName

Expor o último como uma ligação. Além disso, fazer uma das duas últimas propriedades derivadas do outro. Eu faria derivado da propriedade ISOName: o getter voltará self.selectedLanguage.ISOName, e setter irá realizar o look-up para um determinado nome de ISO e conjunto self.selectedLanguage a esse objeto linguagem. Certifique-se de implementar keyPathsForValuesAffectingSelectedLanguage e keyPathsForValuesAffectingSelectedLanguageISOName, e tem o nome da outra propriedade no conjunto que cada método retorna.

Em primeiro lugar, ligam do NSArrayController ligação à propriedade languages do LanguageKeeper conteúdo de matriz.

Então, se ligam três propriedades no botão pop-up:

  • conteúdo a propriedade arrangedObjects do NSArrayController, deixando o caminho da chave modelo vazio (ou configurá-lo para self Se isso causa problemas)
  • Os valores de conteúdo para a mesma propriedade arrangedObjects, com um caminho da chave modelo de “fullName
  • objeto selecionado para a propriedade selectedLanguage do LanguageKeeper

Finalmente, ligam selectedLanguageISOName na LanguageKeeper à propriedade adequada dos padrões do usuário do controlador. (Você não pode vincular o botão pop-up diretamente para a UDC porque o botão pop-up precisa de um de seus objetos de modelo.)

Você também pode tentar ligação conteúdo do botão pop-up ligação aos isoNames e valores de conteúdo de ligação para os fullNames dos dicionários na matriz, mas estou muito desconfiado de usar objetos primitivos como objetos de modelo. Eu tive muitos problemas de que no passado. Além disso, usando objetos do modelo compensa no longo prazo, e eles são muito divertido trabalhar com ele.

Assim, com todos os itens acima no lugar, aqui está o que acontece:

Usuário altera o valor no botão de pop-up
  1. O botão pop-up muda o valor de sua propriedade-objeto selecionado.
  2. que altera a propriedade selectedLanguage do LanguageKeeper.
  3. Isso muda a outra propriedade (selectedLanguageISOName) do LanguageKeeper.
  4. que altera o valor em padrões do usuário através do UDC.
Algum outro objeto altera o valor em padrões do usuário
  1. Os UDC mensagens notificações sobre o valor de ter mudado.
  2. que altera a propriedade selectedLanguageISOName do LanguageKeeper.
  3. Isso muda a outra propriedade (selectedLanguage) do LanguageKeeper.
  4. que altera o valor da propriedade-objeto selecionado do botão de pop-up.
  5. O usuário vê fullName da nova seleção no menu pop-up.

Se você não entender qualquer parte desta resposta, por favor, pedir esclarecimentos.

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