Pergunta

Eu tenho dificuldade para entender Cacau Bindings. Alguém pode me explicar o que é isso tudo, de uma forma que é humanamente perceptível?

Foi útil?

Solução

Ligações é um sistema para ligar os seus pontos de vista aos seus controladores sem escrever um monte de código de cola para torná-los explicitamente falar uns com os outros. Tudo que você tem a fazer é configurar as propriedades em ambas as classes * e ligar o obrigatório em IB.

A abordagem tradicional é que a visão tem uma ou mais saídas para falar com o controlador (os exemplos mais genéricos sendo delegate e target) eo controlador tem lojas para conversar com os pontos de vista. Quando o controlador atualiza o modelo, ele envia (por exemplo) [view modelChange:newModelObject]. Quando a vista quer atualizar o modelo, ele envia alguma mensagem delegado para seu delegado (o controlador), como textDidChange: de NSText.

Com ligações, tudo que você tem que fazer no código é implementar propriedades na vista e propriedades no controlador, em seguida, expor uma ou mais propriedades da vista como ligações *. Então você só precisa ligar a ligação. Se é uma classe de cacau, este é o bolo: basta configurá-lo em IB. Se é uma classe personalizada de seu próprio país, você provavelmente vai escrever a mensagem bind:toObject:withKeyPath:options: si mesmo (não muito difícil).

Deixe-me reafirmar que: Com ligações, o seu código de cola inteiro (na maioria das vezes) é [view bind:@"viewProperty" toObject:self withKeyPath:@"controllerProperty.modelProperty" options:options]; no controlador. Tudo o resto é tratado pelos sistemas de ligações e KVO nos bastidores, e por assessores dos seus Propriedades.

A desvantagem é que você deve estritamente em conformidade com os requisitos Cacau Bindings'. Estes são simples, mas um monte de aplicativos mais antigos foram concebidos de uma forma que não se encaixa Cacau ligações.

  • Você deve criar objetos do modelo real, não apenas passar objetos primitivos (por exemplo, matrizes de dicionários) ao redor. Se você estiver usando Core Data, isso é fácil:. Seus objetos gerenciados são objetos do modelo
  • Você deve escrever seus acessores corretamente ou sintetizar os acessores corretas. Por exemplo, uma propriedade NSString deve ser sempre @property(copy) nunca @property(retain) (porque caso contrário, você vai encontrar-se mantendo outra pessoa corda mutável, que então eles vão mutação enquanto você está segurando-o).
  • Você deve única propriedades de mudança de seu modelo de objetos por suas propriedades (model.foo = bar) ou pelo assessor mensagens ([model setFoo:bar]), não pelo acesso variável de instância direta. (Exceção óbvia para acessores próprios, se você escreveu seu próprio país, porque eles devem acessar a variável de instância diretamente métodos.)

Há duas vantagens:

  • Você pode escrever uma nova classe vista marca sem ter que arrancar um monte de código de cola. O máximo que você terá que apagar algumas mensagens é bind:::: para propriedades do velho vista. Se, de um par de anos na estrada, você decide que a sua visão atual simplesmente não pode ser escalado para futuras capacidades de sua aplicação, isso lhe dá a flexibilidade para rasgá-lo fora e começar de novo com o mínimo de dor.
  • Mais importante, a menos código você tem que ler, o que é mais fácil de lê-lo.

* E, de acordo com a documentação, implementar um KVO método de observação na classe vista, mas eu nunca realmente tive que fazer isso. Eu arquivei uma documentação bug .

Adicionado 2009-03-07: Ah, encontrou uma citação. “Subclasses NSView pode expor valor-chave de codificação adicional / chave-valor-observando propriedades aderentes como ligações chamando o método de classe exposeBinding: para cada uma das propriedades.” - NSKeyValueBindingCreation Então você shouldn't necessidade de implementar um método de observação KVO.

Outras dicas

resposta anterior é muito comperhensive e bom, eu apenas pensei que eu iria adicionar uma resposta explica o que é em sua essência, sem envolver Cacau ou Objective-C especificamente. Isso porque o conceito em si é agnóstico linguagem embora linguagens dinâmicas como Objective-C torna um muito mais fácil do que uma linguagem mais estático como C ++.

Exemplo

Say você tem dois objetos M e V . M tem métodos:

setX(int x);
setY(int y);
int getX();
int getY();

Enquanto V tem métodos:

setA(int x);
setB(int y);
int getA();
int getB();

Uma forma de olhar para isto é que M tem propriedades x e y e V tem propriedades < strong> um e b . Você quer uma mudança de propriedade x para causar uma mudança na propriedade b e uma mudança na y para causar uma mudança na a .

Pela mudança na propriedade x que queremos dizer por exemplo:.

M.setX(10)

onde anteriormente

M.getX() != 10

Então, nós queremos uma chamada de setX em M para causar uma chamada para setA em V .

O que as ligações permitem que você dizer é que a propriedade b no objeto V é obrigado a propriedade x no objeto M . E então esta atualização é feita automaticamente. Você como um codificador não tem que escrever código que verifica se x é alterado e, em seguida, chamar setB em V . Ligações cuida disso automaticamente.

Resumo

Ligações permite ligar duas propriedades em conjunto que existem em dois objetos diferentes, de modo que a alteração do valor de uma das propriedades faz com que a propriedade dependente em outro objeto para a mudança para o mesmo valor.

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