如果我有两种不同类型的单元格,如何使用 FetchedResultsController?

Posted

技术标签:

【中文标题】如果我有两种不同类型的单元格,如何使用 FetchedResultsController?【英文标题】:How do I use FetchedResultsController if I have two different kinds of cells? 【发布时间】:2013-04-05 20:15:26 【问题描述】:

我在 IB 中有一个原型 tableview,它有两种不同的单元格:一个完整​​的单元格和一个基本的单元格(用于显示文章,我根据文章的类型使用每一个)。

我想将 FetchedResultsController 集成到我的应用程序中,这样我就可以使用 CoreData 来填充 tableview,但之前(使用 NSArray 而不是 FetchedResultsController)我处理单元格设置如下:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

    int row = indexPath.row;
    static NSString *CellIdentifier = nil;
    Article *article = self.articles[row];

    // Checks if user simply added a body of text (not from a source or URL)
    if (article.isUserAddedText) 
        CellIdentifier = @"BasicArticleCell";
    
    else 
        CellIdentifier = @"FullArticleCell";
    

    ArticleCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

    // If the user simply added a body of text, only articlePreview and progress has to be set
    cell.articlePreview.text = article.preview;
    cell.articleProgress.text = [self calculateTimeLeft:article];

    // If it's from a URL or a source, set title and URL
    if (!article.isUserAddedText) 
        cell.articleTitle.text = article.title;
        cell.articleURL.text = article.URL;
    

    return cell;

但是现在我不知道如何检查它是否是基本文章(就像之前我检查了 NSArray 中 Article 对象的属性一样)。我看到的一篇文章是这样做的:

- (UITableViewCell *)tableView:(UITableView *)tableView
    cellForRowAtIndexPath:(NSIndexPath *)indexPath 

    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell =
        [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    // Set up the cell...
    [self configureCell:cell atIndexPath:indexPath];

    return cell;

但是在我决定单元格标识符是什么之前,我需要知道它是什么类型的文章,所以我不知道我该怎么做。我是否能够及早获取 FetchedResultController 对象,查询它以查看 article 属性的值(无论它是否是基本的)并相应地设置 CellIdentifier?或者还有什么我应该做的吗?

TL;DR:当使用 FetchedResultsController 时,如何根据单元格中显示的对象类型来决定 CellIdentifier。

【问题讨论】:

【参考方案1】:

您可以使用与在检索 Article 看起来有点不同之前所做的完全相同的逻辑

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

  Article *article = [self.fetchedResultsController objectAtIndexPath:indexPath];

  NSString *CellIdentifier = [article isUserAddedText] ? @"BasicArticleCell" : @"FullArticleCell";

  UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

  // Set up the cell...
  [self configureCell:cell atIndexPath:indexPath];

  return cell;

【讨论】:

【参考方案2】:

当您从 fetchedResultsController 检索对象时,您可以检查类型,然后根据返回的内容决定要创建的单元格类型。例如:

id result = [fetchedResultsController objectAtIndexPath:indexPath];
if ([result isKindOfClass:[MyObject class]]) 
   // It's a MyObject, so create and configure an appropriate cell
 else ...

【讨论】:

根据您获取文章对象的方式,您还可以设置/定义一个“isBasic”BOOL 标志,您可以在设置单元格之前查找该标志。 作为实体中的属性,你的意思是?

以上是关于如果我有两种不同类型的单元格,如何使用 FetchedResultsController?的主要内容,如果未能解决你的问题,请参考以下文章

如何拥有具有两种不同单元格类型的 UITableView 并以编程方式设置每个单元格布局,而不是通过情节提要?

如何组织表格视图单元格

如何快速订购两个动态表格视图单元格?

iOS UICollectionView 动态切换单元格NIB

UITableViewCell 为不同的方向和单元格类型加载自定义 XIB

UICollectionView 对齐单元格