Qual é a melhor maneira de adicionar uma propriedade composta para ligação a uma classe existente

StackOverflow https://stackoverflow.com/questions/922128

Pergunta

Digamos que eu tenha uma classe de tamanho que tem propriedades de altura e largura (na realidade, a classe é um pouco mais complexa do que isso, mas o tamanho faz um bom exemplo).

Eu quero mostrar isso como $ largura x altura $ na minha interface do usuário.

A maneira óbvia para fazer isto é ligam-se a uma propriedade de dimensões que é dependente de largura e altura.

A minha pergunta é, onde é o melhor lugar para adicionar esta nova propriedade?

Eu poderia adicioná-lo para a própria classe Tamanho do modal, mas depois se outro controlador quer mostrar o diferente corda Estou criando preso ainda uma outra propriedade. Eu também sou um pouco relutante em fazer isso porque no meu caso a classe tamanho é em um quadro que será usado em alguns lugares diferentes (embora provavelmente tudo a partir do código que eu tenho controle sobre).

Eu poderia adicioná-lo em uma categoria para a classe Size dentro do projeto que contém a exibição / controlador para que ele só será disponibilizadas nos lugares que eu sei que vai ser usado, mas em vários lugares que eu vi sugestões que categorias tendem para ser usado em demasia, e sou forçado a se perguntar se este é um desses casos.

No caso de uma única instância Tamanho eu poderia criar a propriedade na classe de controlador que o contém, mas isso se torna mais difícil quando você tem uma variedade de tamanhos.

Eu poderia ligar-se a todo o objeto tamanho e usar um transformador para transformá-los em cordas, mas a ligação a uma variedade de tamanhos, então, fazer com que você tem que transformar cada elemento da matriz em uma nova matriz no transformador, que parece um pouco feio.

Foi útil?

Solução

Se quer mostrar este valor composto como uma string, então ligam "Display Padrão 1" de um campo de texto para a propriedade width e "Padrão Display 2" (mostrado quando se ligam de exibição padrão 1) para a propriedade height. Na exibição padrão 1 de ligação, defina o "Padrão Display" para %{value1}@ x %{value2}@ (sim, sintaxe um pouco unintuitive). Isso dará um campo de texto que exibe "[largura] x [altura]" e irá atualizar sobre as mudanças em qualquer propriedade.

Você pode fazer o mesmo com um NSTextFieldCell, por exemplo, como a célula em um NSTableColumn. A desvantagem deste método é que o campo de texto não será capaz de editar os valores width e height encadernados. Você teria que escrever um NSValueTransformer se você precisa ser capaz de editá-los.

Outras dicas

Usando várias ligações através de um padrão de exibição como Barry sugeriu soa como a melhor abordagem, pelo menos, sem saber mais sobre a sua UI. Eu usei a mesma coisa no passado, onde eu construí um inspector para uma matriz de imagens e tinha as dimensões vinculado a um único campo de texto.

Em geral, é boa prática para transformadores de valor de uso ou formatadores Se você puder, mas em casos de último recurso não há nada de errado em usar uma categoria. Eu fiz isso no passado, quando eu tinha dificuldade para se ligar a uma data, mas dividi-lo em hora e data peças individuais. A categoria é uma abordagem boa, porque permite manter a separação com o modelo, mas você não precisa fazer nada louco como ligação diretamente ao controlador.

Eu quero mostrar isso como $ largura x altura $ na minha interface do usuário.

Por que não dois campos? Então você poderia torná-los editáveis.

(na realidade, a classe é um pouco mais complexa do que isso, mas o tamanho faz um bom exemplo)

Assumindo que o acima não é viável na sua situação real, você pode tentar criar uma subclasse personalizada de NSFormatter, e defini-lo como o formatador na célula (Eu suponho que este é numa vista de tabela, desde que você não ligaria um controle único para uma matriz). Você, então, ligar-se a todo objetos Tamanho.

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