3

在我的iPhone核心数据应用程序中,我已经配置了一个主 - 细节视图设置。NSFetchedResultsController获取请求 - 更新谓词和UITableView

主视图是一个UITableView,其中列出了List实体的对象。 List实体与Task实体(称为“任务”)具有多对多的关系,并且任务实体与List称为“list”具有相反的关系。

当在主视图中选择一个对象List,我想要的细节视图(另一个的UITableView)以列出对应于List对象Task对象。什么我迄今所做的是:

在详细信息视图控制器我已经宣布了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属性的setter详细信息视图控制器是这样的:

- (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; 
}  

其从核心数据项目模板默认几乎没有变化,我所做的改变是增加一个谓词总是返回false,原因是当没有选择列表时,我不希望在详细视图中显示任何项目(如果选择了列表,则列表属性中的谓词在setter中更改)。

但是,当我选择一个列表项时,什么也没有发生。表格视图中没有任何变化,它保持为空。我敢肯定,我的逻辑是在几个地方有缺陷,建议表示赞赏

感谢

回答

1

您无需为您的任务列表设置NSFetchedResultsController。既然你是通过在实体列表,你可以问列表实体的任务:

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 

(或任何这种关系被称为)将返回与List对象关联的任何Task对象的NSSet。

相关问题