Pergunta

no meu aplicativo eu fiz uma ligação muito simples. Eu tenho um NSMutableArray vinculado a um NSArrayController. O próprio controlador está ligado a uma caixa de combinação e mostra todo o conteúdo do NSMutableArray. Funciona bem.

O problema é: O conteúdo da matriz vai mudar. Se o usuário faz alguns ajustes para o aplicativo eu excluir todos os itens da NSMuteableArray e preenchê-lo com novas e diferentes itens.

Mas a ligação do NSMutableArray <-> NSArrayController <->. NSComboBox não atualizar

Não importa se eu remover todos os objetos da matriz a caixa de combinação ainda mostra os mesmos itens.

O que está errado aqui? É a minha abordagem errada ou eu só precisa dizer a ligação a refrescar-se? Eu não consegui descobrir como fazer isso.

Foi útil?

Solução

Você é provável "editar a matriz atrás das costas do controlador", que subverte o mecanismo KVO.

Você disse:

Eu tenho um NSMutableArray vinculado a um NSArrayController.

Como? Onde é que a matriz viver? Em um documento, acessível através de uma KVC / KVO compatível -myArray / -setMyArray: conjunto de assessores

Eu aposto que você está dizendo diretamente o ivar "myArray" para -removeAllObjects, certo? Como é que estes KVC / KVO acessores "conhecer" a matriz mudou?

A resposta é, eles não. Se você está realmente substituir todo o conjunto, você quer dizer seu documento (ou quem quer que possui a matriz) para -setMyArray: para uma matriz totalmente novo. Isso irá provocar as chamadas KVO adequada.

... mas então, você realmente não precisa de uma matriz mutável, não é? Se você só deseja substituir itens individuais na matriz, você vai querer usar acessores indexados:

(Documentação - Veja os padrões Coleção do assessor para seção de para-muitos Propriedades) http://tinyurl.com/yb2zkr5

Outras dicas

Tente isto (usando ARC / OS X 10.7):

no arquivo de cabeçalho, definir o arrayInstance eo arrayController

 @property (weak) IBOutlet NSArrayController *arrayController;
 @property (strong) NSArray *arrayInstance; // for the array instance

, em seguida, na implementação

 @synthesize arrayController = _arrayController;
 @synthesize arrayInstance = _arrayInstance;

 _arrayInstance = .......  // What ever the new array will be
 [_arrayController setContent:_arrayInstance];

Isso forçará o arrayController para atualizar o conteúdo e exibidos corretamente.

Outra mas 2 linhas de solução de código seria:

 [self willChangeValueForKey:@"arrayInstance"];
 _arrayInstance = .......  // What ever the new array will be
 [self didChangeValueForKey:@"arrayInstance"];

acho que a primeira parece mais óbvio, o segundo mais KVO-like.

cumprimento KVC / KVO parece ser o problema. Você deve criar a nova matriz e atualizar a referência com o novo objeto usando os métodos de acesso gerados. De contrário pode mensagens KVO fogo sobre a matriz que está sendo atualizado para informar as ligações, que o conteúdo da matriz mudaram.

Christian

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