Pergunta

Apple tem um bom pequeno tutorial para fazer uma interface de mestre-detalhe simples. Interface Builder irá gerar até mesmo automaticamente para você a partir de uma entidade Core Data. No entanto, eu estou tentando fazer algo mais complicado do que o exemplo simples e eu estive lutando por um tempo para obtê-lo para o trabalho.

Eu tenho um aplicativo com base em documento Core Data. O modelo inclui uma entidade abstrata página, e vários subentidades concretas de Página. Todas as páginas têm alguns atributos em comum (como "nome") e aqueles estão definidos na página. Obviamente, os subentidades tem os atributos que são exclusivos para eles.

Eu quero a interface para permitir ao usuário ver todos os tipos de páginas na lista master (um NSTableView). Quando seleccionar uma página, os campos de detalhes que são exibidos vai depender de que tipo de página que é.

Aqui está o que eu tenho agora:

Eu tenho um arquivo nib principal, onde a lista principal é exibida, além de todos os campos comuns a uma página. Há uma ponta para cada tipo de página com seus campos específicos. Há o principal NSArrayController no arquivo nib principal, que é preencher o NSTableView. Há uma NSArrayController em cada uma das pontas específicas páginas bem para que eu possa ligar os campos de detalhes de atributos da seleção atual. Todos os meus NSArrayControllers são configurados de forma idêntica, e eu tenho todos eles ligados ao mesmo managedObjectContext e os mesmos selectionIndexes.

Eu estou usando o método de Aaron Hillegass de vista a troca de que ele descreve em seu livro de cacau. Então eu registrado para NSTableViewSelectionDidChangeNotifications, e quando eu receber um, ele chama um SwitchView método:

aparência SwitchView no objeto selecionado, cheques qual o tipo de página que está, e swaps no arquivo nib apropriado de acordo com o método de Hillegass.

Tudo funciona bem se eu só adicionar páginas de um tipo, mas assim que eu adicionar uma página de um segundo tipo, eu recebo este erro:

valor de ajuste de erro para selectionIndexes caminho da chave de objecto (a partir de entidade objecto dependente: página, o número de objectos seleccionados: 1): [valueForUndefinedKey:]:. A entidade NoColPage não é a codificação compatível com valor de chave para o lado da chave

A última parte do erro faz sentido:. É preso tentando mostrar a ponta errada, então ele está tentando vincular a campos que não existem para este objeto

Eu adicionei um campo selectionIndexes para MyDocument para que todos os meus NSArrayControllers poderia ligar para o mesmo lugar. Eu agonizava sobre isso por dias e eu não consigo entender. Alguma idéia?

Se ajudar, aqui é um projeto de exemplo que você pode baixar . Eu extraí apenas as coisas relevantes para este problema do meu projeto em um novo aplicativo fictício, que eu tenho usado para testar e brincar.

PS: Ferramenta de Interface Builder para gerar uma interface de mestre-detalhe de uma entidade Core Data não funciona como eu quero que ele para entidades abstratas. Ele só cria campos para os atributos na superentitity.

Editar: Eu acho que Joshua é sobre a algo, mas, infelizmente, ele não funciona - eu continuo correndo para o mesmo problema. No começo eu estava tendo um momento difícil, porque eu não entendia que -unbind: espera uma cadeia constante, não um caminho chave.

Eu tentei diversas variações: onde eu manter o controle de controlador de matriz do nib atualmente exibida; onde eu acompanhar o tipo de página atualmente exibida e / rebind única unbind quando eu estou tentando exibir um tipo de página diferente ...

Aqui está a seção relevante do código.

-(void) displayViewController: (ManagingVC *) vc withClass:(NSString*) className {

//Try to end editing
NSWindow *w = [box window];
BOOL ended = [w makeFirstResponder:w];
if (!ended) {
    NSBeep();
    return;
}

//The Managing View Controller's NSArrayController
NSArrayController* vcAc = [vc arrCont];

//if the page we're trying to switch to is NOT the same type as the current page we're displaying
//if it is, do nothing.
if (![currPageDisplayed isEqual:className]) {

    //unbind the old view controller
    ManagingVC *oldvc = [viewControllers objectForKey:className];
    NSArrayController* oldsac = [oldvc arrCont];
    [oldsac unbind:@"selectionIndexes"];

    //bind the new view controller
    [vcAc bind:@"selectionIndexes" toObject:self withKeyPath:@"selectionIndexes" options:nil];
    currPageDisplayed = className;

    NSView *v = [vc view];

    //display the new view in an NSBox in the main nib
    [box setContentView:v];
}

}

Foi útil?

Solução 2

Depois de passar tempo demais tentando controlador de matriz de cada NIB em sincronia, eu desisti dessa abordagem. A única coisa que tem trabalhado para mim é programaticamente controlar quais elementos gráficos são exibidos na ponta principal, e suas ligações. Isso significa eliminar as outras nibs. Isto não é realmente uma solução sustentável se você estiver trabalhando com mais do que apenas um par de campos de texto, mas funciona para mim agora.

Eu ainda seguir o conselho de desligamento de Josué antes de mudar a vista, mas agora eu só estou ligando os campos de texto para arrayController.selection.whateverKey

Outras dicas

O problema é que você está deixando controladores de matriz de seus nibs obrigados a selecção do documento, o que está causando-lhes para tentar (quando as alterações de seleção) para representar o item selecionado.

Tente isto:

  1. Remover as ligações nas pontas.
  2. Antes de adicionar um novo ponto de vista, conectar suas ligações no código.
  3. Antes de retirar a antiga visão, desligue suas ligações no código.

Isso deve manter tudo feliz.

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