在我的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中更改)。
但是,當我選擇一個列表項時,什麼也沒有發生。表格視圖中沒有任何變化,它保持爲空。我敢肯定,我的邏輯是在幾個地方有缺陷,建議表示讚賞
感謝
這看起來好多了,會試試看,謝謝! – indragie