NSFETCHEDRESULTSCONTROLLER APECTURA - Atualizando o predicado e o UAableView
-
22-09-2019 - |
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
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.