Encadernação dois modelo-chave caminhos-diferentes para a mesma seleção NSArrayController
-
05-09-2019 - |
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?
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 paraself
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 isoName
s e valores de conteúdo de ligação para os fullName
s 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- O botão pop-up muda o valor de sua propriedade-objeto selecionado.
- que altera a propriedade
selectedLanguage
do LanguageKeeper. - Isso muda a outra propriedade (
selectedLanguageISOName
) do LanguageKeeper. - que altera o valor em padrões do usuário através do UDC.
- Os UDC mensagens notificações sobre o valor de ter mudado.
- que altera a propriedade
selectedLanguageISOName
do LanguageKeeper. - Isso muda a outra propriedade (
selectedLanguage
) do LanguageKeeper. - que altera o valor da propriedade-objeto selecionado do botão de pop-up.
- 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.