Pergunta

No meu aplicativo de dados principal do meu iPhone, eu o configurei em uma configuração de visualização principal de detalhes.

A visualização principal é uma visualização uable que lista objetos do List entidade. A entidade da lista tem um relacionamento para muitos com o Task entidade (chamada "tarefas"), e a entidade da tarefa tem um relacionamento inverso para List chamado "Lista".

Quando um List O objeto é selecionado na visualização mestre, quero a visualização detalhada (outra visão de uite) para listar o Task objetos que correspondem a isso List objeto. O que eu fiz até agora é o seguinte:

No Detalhe View Controller, eu declarei uma propriedade para um List objeto:

@property (nonatomic, retain) List *list;

Então, no controlador mestre de exibição, eu uso este método de delegado de exibição de tabela para definir o list propriedade do controlador de visualização detalhada quando uma lista é selecionada:

- (void)tableView:(UITableView *)aTableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    NSManagedObject *selectedObject = [[self fetchedResultsController] objectAtIndexPath:indexPath];
    detailViewController.list = (List*)selectedObject; 
}

Então, eu superei o setter para o list Propriedade no Detalhe View Controller como este:

- (void)setList:(List*)newList
{
    if (list != newList) {
        [list release];
        list = [newList retain];

        NSPredicate *newPredicate = [NSPredicate predicateWithFormat:@"(list == %@)", list];
        [NSFetchedResultsController deleteCacheWithName:@"Root"];
        [[[self fetchedResultsController] fetchRequest] setPredicate:newPredicate];

        NSError *error = nil;
        if (![[self fetchedResultsController] performFetch:&error]) {
            NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
            abort();
        }       
    }
}

O que estou fazendo aqui é definir um predicado nos resultados buscados para filtrar os objetos, para que eu obtenha apenas os que pertencem aos selecionados List objeto. O Getter FetchedResultScontroller para o controlador de visualização de detalhes se parece com o seguinte:

- (NSFetchedResultsController *)fetchedResultsController {
    if (fetchedResultsController == nil) {
        NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
        NSEntityDescription *entity = [NSEntityDescription entityForName:@"Task" inManagedObjectContext:managedObjectContext];
        [fetchRequest setEntity:entity];

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"FALSEPREDICATE"];
    [fetchRequest setPredicate:predicate];

        NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];
        NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];

        [fetchRequest setSortDescriptors:sortDescriptors];

        NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:nil cacheName:@"Root"];
        aFetchedResultsController.delegate = self;
        self.fetchedResultsController = aFetchedResultsController;

        [aFetchedResultsController release];
        [fetchRequest release];
        [sortDescriptor release];
        [sortDescriptors release];
    }

    return fetchedResultsController;
}    

Quase inalterado do padrão no modelo de projeto de dados principal, a alteração que fiz é adicionar um predicado que sempre retorna falsa, a razão é que, quando não há lista selecionada, não quero que nenhum itens seja exibido nos detalhes Visualização (se uma lista for selecionada, o predicado será alterado no setter para a propriedade da lista).

No entanto, quando seleciono um item de lista, nada realmente acontece. Nada na visualização da tabela muda, ela permanece vazia. Tenho certeza de que minha lógica é falha em vários lugares, o conselho é apreciado

Obrigado

Foi útil?

Solução

Você não precisa configurar um NSFetchedResultsController para sua lista de tarefas. Como você está passando na entidade da lista, basta pedir à entidade da lista as tarefas:

NSSet *tasks = [[self list] valueForKey:@"tasks"];
NSSortDescriptor *sort = ...;
NSArray *sorted = [[tasks allObjects] sortedArrayUsingDescriptors:[NSArray arrayWithObject:sort]];
[self setTasks:sorted];

Então tenha o UITableviewDatasource métodos funcionem disso tasks variedade.

Outras dicas

Talvez eu não entenda sua configuração completamente, mas

detailViewController.list.task

(ou qualquer que seja o que seja chamado) retornará um nsset de quaisquer objetos de tarefa associados ao objeto da lista.

Bem, eu tenho um problema semelhante e publiquei minha pergunta em Como alternar o NSFetchEdResultScontroller (ou seu predicado) da UitableView (ou seu predicado) programaticamente?.

Depois de postar, decidi experimentar seu código. E sabe de uma coisa? Funciona, com apenas uma pequena adição:

    [self.tableView reloadData];

Talvez você possa voltar ao seu código inicial e confirmar.

Cumprimentos.

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