Pergunta

Eu estou tendo alguns problemas para exibir o conteúdo de um NSArrayController em duas janelas definidas em diferentes XIBs.

Na minha janela principal (em MainMenu.xib), tenho uma NSTableView que está vinculado a um NSArrayController

Na minha segunda XIB, eu tenho uma outra janela que contém um NSTableView. Eu criei um novo NSArrayController, e amarrou a mesa para o conteúdo dessa NSArrayController.

Ambos os NSArrayControllers são obrigados a exatamente o mesmo NSArray.

Tudo está bem no início, mas o problema é que, se um objeto é adicionado à matriz usando o NSArrayController na janela principal, vista da janela secundária dos dados não é atualizado. Isso é mais provável porque ele não sabe que ele precisa atualizar-se, desde a sua NSArrayController não foi usado para adicionar o novo objeto.

O que eu gostaria de fazer é usar a mesma instância exata do NSArrayController em ambas as janelas. Dessa forma, se um objeto é adicionado à matriz, ambas as visões serão notificados sobre a alteração.

O problema é que eu não consigo descobrir como fazer isso no Interface Builder. Eu não posso ligar um NSArrayController para outro NSArrayController (eu recebo um erro de execução indicando que ele só pode ser vinculado a um NSArray). Ligar o NSArrayController ao membro NSArrayController do dono do arquivo não vai ajudar tanto, uma vez que só vai acabar com a NSArrayController que eu quero usar.

Eu acho que eu poderia definir as ligações de mim mesmo em código, mas parece que seria melhor usar Interface Builder, se possível. Existe uma maneira de fazer isso no Interface Builder, ou talvez a melhor maneira de configurar isso todos juntos?

Update: Em resposta a resposta e os comentários de Chuck, eu tentei o seguinte: -Bound o conteúdo da tabela da minha NSTableView aos arrangedObjects do membro NSArrayController (se eu usasse a própria NSArrayController, um erro apareceu no log: "[contagem NSArrayController]: selector não reconhecido enviada à instância") -Bound cada coluna na tabela para dono do arquivo, com um trajeto Modelo Key of arrayController.arrangedObjects.propertyName

Isto ainda não resultou no conteúdo da mesa recebendo atualizações. Eu acho que isso é porque eu estou ligação aos arrangedObjects do NSArrayController, em vez do próprio NSArrayController. Mas, se eu ligar para o NSArrayController diretamente, que me dá erros.

Normalmente, eu iria escolher o meu NSArrayController do "Vincular a" caixa de combinação, use arrangedObjects como a chave Controller, eo próprio estabelecimento como o Caminho Modelo Key. Não tenho certeza de como fazer o equivalente a que, neste caso -. Se eu puder em tudo

Eu fiz alguma coisa errada no processo acima?

Foi útil?

Solução

A melhor opção que eu tenho sido capaz de vir acima com é para notificar a segunda NSArrayController que a matriz é a gestão mudou chamando rearrangeObjects: nele. Isso parece desajeitado, mas funciona.

Outras dicas

E configurá-los como objetos de proxy no IB, em seguida, instanciar o real em código, talvez em seu delegado app?

Você pode obter ambos os NSArrayControllers para atualização via KVO quando a matriz é adicionado. O truque é que você tem que observar e adicionar à matriz de uma forma compatível KVO.

Você gostaria algum objeto que possui a matriz, vamos chamá-lo de "modelo". A matriz tem que ser uma chave no objeto, vamos chamar a tecla "contentArray". Em seguida, quando você está adicionando a / remoção de, você deve fazê-lo pelo primeiro mutableArrayForKey chamada em "modelo" para obter "contentArray". Em seguida, a adição / remoção da matriz deve trabalhar, por exemplo:

Controller1 é obrigado a self.model.contentArray

controlador2 é obrigado a self.model.contentArray

//this method is on the "model" object
-(void)addContent(id content)
{
    NSMutableArray* contentArr = [self mutableArrayForKey:@"contentArray"];
    [contentArr addObject:content]; //this will trigger KVO notifications
}

Como alternativa, você poderia fazer as notificações KVO manualmente assim:

-(void)addContent(id content)
{
    [self willChangeValueForKey:@"contentArray"];
    [m_contentArray addObject:content];
    [self didChangeValueForKey:@"contentArray"];
}

Não há nenhuma razão ter dois controladores de matriz deve fazer um ponto de vista não atualizar quando você atualizar através de um outro. Se isso não está acontecendo, parece que as notificações de KVO estão se perdendo em algum lugar. O mais provável é que você está editando diretamente uma matriz (no de um NSArrayController subclasse método add:, talvez?) Sem enviar as notificações de alteração adequada.

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