В приложении iPhone Core Data я сконфигурировал его в настройке просмотра основных деталей.NSFetchedResultsController fetch request - обновление предиката и UITableView
Главный вид - это UITableView, в котором перечислены объекты объекта List
. Сущность List имеет отношение to-many к объекту Task
(так называемые «задачи»), а объект Task имеет отношение «обратное к одному» с List
, называемое «список».
Когда List
объекта выбран в основной точке зрения, я хочу, чтобы детализированный вид (другой UITableView) перечислить Task
объектов, которые соответствуют этому List
объекту. То, что я сделал до сих пор это:
В контроллере представления подробно я объявил свойство для List
объекта:
@property (nonatomic, retain) List *list;
Затем в контроллере мастер вида я использую этот вид таблицы делегирует метод установки list
свойства контроллера представления детали при выборе списка:
- (void)tableView:(UITableView *)aTableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
NSManagedObject *selectedObject = [[self fetchedResultsController] objectAtIndexPath:indexPath];
detailViewController.list = (List*)selectedObject;
}
Затем я перекрываться сеттером для list
собственности в контроллер зрения подробно, как это:
- (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();
}
}
}
Что я здесь делаю устанавливает предикат на принесенных результаты, чтобы отфильтровать объекты, так что я получаю только те, которые принадлежат к выбранному List
объекта. FetchedResultsController геттер для контроллера представления детали выглядит следующим образом:
- (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;
}
Ее практически не изменился от значения по умолчанию в шаблоне проекта Ядра данных, изменение, которое я сделал, чтобы добавить предикат, который всегда возвращает ложь, причина в том, что когда нет выбранного списка, я не хочу, чтобы какие-либо элементы отображались в подробном представлении (если выбран список, предикат изменяется в настройщике для свойства списка).
Однако, когда я выбираю элемент списка, ничего действительно не происходит. Ничто в представлении таблицы не меняется, оно остается пустым. Я уверен, что моя логика ошибочна в нескольких местах, совет ценится
Благодаря
Это выглядит намного проще, даст вам попробовать, спасибо! – indragie