3

В приложении 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; 
}  

Ее практически не изменился от значения по умолчанию в шаблоне проекта Ядра данных, изменение, которое я сделал, чтобы добавить предикат, который всегда возвращает ложь, причина в том, что когда нет выбранного списка, я не хочу, чтобы какие-либо элементы отображались в подробном представлении (если выбран список, предикат изменяется в настройщике для свойства списка).

Однако, когда я выбираю элемент списка, ничего действительно не происходит. Ничто в представлении таблицы не меняется, оно остается пустым. Я уверен, что моя логика ошибочна в нескольких местах, совет ценится

Благодаря

ответ

1

Для вашего списка задач вам не нужно устанавливать NSFetchedResultsController. Так как вы передаете в объекте List, вы можете просто попросить объект List для задач:

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

Тогда имеют UITableviewDatasource методы убегают из этого tasks массива.

+0

Это выглядит намного проще, даст вам попробовать, спасибо! – indragie

0

Может быть, я не понимаю, ваша установка полностью, но

detailViewController.list.task 

(или независимо от того, что отношения называется) вернет NSSet любых объектов задачи, связанных с объектом List.

0

Ну, у меня есть аналогичная проблема, и я отправил свой вопрос по адресу How to switch UITableView's NSFetchedResultsController (or its predicate) programmatically?.

После того, как я разместил его, я решил попробовать ваш код. И знаешь, что? Он работает только с небольшим добавлением:

[self.tableView reloadData]; 

Возможно, вы можете вернуться к исходному коду и подтвердить.

С уважением.