4

我的核心數據模型是這樣的:推導的UITableView部分「一對多」的關係

article <--->> category 

它甚至可以遠程使用NSFetchedResultsController產生一個UITableView,看起來像嗎?

Category 1 
    - Article A 
    - Article B 
    - Article C 
Category 2 
    - Article A 
    - Article D 
    - Article E 
    - Article F 
Category 3 
    - Article B 
    - Article C 

具體而言,我感興趣的(邊緣?),其中每個的UITableView部分具有唯一標題的情況下(例如,「類別1」,「類別2」),但同一對象可以在多個存在章節(例如,第1條和第2條都存在A條)。

我已經走遍蘋果公司的核心數據文檔,並花了兩天時間在這裏仔細閱讀問題,但很可惜,沒有運氣甚至查不到這是否是可能的,更不用說如何實現它。感謝任何幫助或指向以前回答的問題。我當然找不到它。

回答

9

是的,這很容易,但有100萬的方式來做到這一點。

你的視圖控制器應該是UITableView的「數據源」,並返回關於行的數目的信息有,然後每個單獨的行的內容。

有一個tableview中一個「節」的概念,你可以選擇有一個爲每個類別。

例如,您可以創建一個NSFetchedResultsController來查找要顯示的類別,並使用它填充表視圖部分,然後每個類別都將具有多對多關係的文章,以填充行在每個部分。

像這樣的東西應該讓你開始(假設你的類別和文章的實體都包含title屬性):

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
{ 
    // return the number of categories 
    [[self.categoryResultsController fetchedObjects] count]; 
} 

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section 
{ 
    // return the title of an individual category 
    [[self.categoryResultsController.fetchedObjects objectAtIndex:section] valueForKey:@"title"]; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    // return the number of articles in a category 
    MyCategory *category = [self.categoryResultsController.fetchedObjects objectAtIndex:section]; 

    return category.articles.count; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    // fetch a cached cell object (since every row is the same, we re-use the same object over and over) 
    static NSString *identifier = @"ArticleCellIdentifier"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier]; 
    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier] autorelease]; 
    } 

    // find the category and article, and set the text of the cell 
    MyCategory *category = [self.categoryResultsController.fetchedObjects objectAtIndex:indexPath.section]; 

    cell.textLabel.text = [[category.articles objectAtIndex:indexPath.row] valueForKey:@"title"]; 

    return cell; 
} 

你可以閱讀這些方法的文檔,以找出如何進一步自定義它。

+0

打我給它: P –

+0

保羅和阿比,謝謝。這工作完美。 – Dave

0

我會忍不住拋棄NSFetchResultsController因爲我沒有在這裏看到那麼多好處,但我沒有把太多心思進,所以我可能是錯的。

你可以做的是:

  1. 所有category的執行讀取請求,並把它們放入一個NSArray。這些將是你的部分。
  2. 對於區段計數返回category
  3. 對於行的次數內返回self.category.articles

這裏伯爵的一步一些示例代碼2 + 3

// 2 
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView; 
{ 
    return [self.categories count]; 
} 

// 3 
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section; 
{ 
    return [[[self.categories objectAtIndex:section] articles] count]; 
}