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。

相關問題