从已存储的数据中管理 tableview 单元格

Posted

技术标签:

【中文标题】从已存储的数据中管理 tableview 单元格【英文标题】:Manage tableview Cells from already stored data 【发布时间】:2014-06-01 17:59:12 【问题描述】:

您好,我正在尝试制作具有 5 个单元格的表格视图,每个单元格会自动填充我存储的数据或数据类型。这是我想到的一个例子,如果我的问题不够清楚,请告诉我 干杯。

也许我问错了问题,我会试着解释更多。 所以我正在制作的应用程序是这样工作的: 我有 5 种不同的钻孔类型,每种都有不同的条件,我需要为每种钻孔类型制作不同的钻孔记录统计信息 (UI) 和 tableView, 因此,在第一个调用 Drills 的表格视图中,我有一个单元格应该显示用户制作的钻取类型和日期还有一个创建钻取按钮,该按钮让用户创建钻取 (UI),其中包含一些属性,例如名称、日期, 和 DrillType(只有 5 个选项), 在此之后,我必须为每种钻取类型制作 5 个不同的表格和 scoreViewControl,以便他们能够根据需要多次插入统计信息。 在这里我有问题,我不知道管理将单元格导航到正确的 [drilltype] 表格视图的最佳方法是什么。 (如果我在创建钻头时不需要某些条件,我只需制作 5 个静态单元格并将它们导航到不同的方向)

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


    if([self.drill.drillType  isEqual: @"Grouping"] )

    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

    Drill *drill = [self.fetchedResultsController objectAtIndexPath:indexPath];
    cell.textLabel.text = drill.drillType;
    cell.detailTextLabel.text = drill.drillDate;

    return cell;
    
    else if([self.drill.drillType  isEqual: @"Normal"] )

        static NSString *CellIdentifier = @"Cell2";
        UITableViewCell *cell2 = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

        Drill *drill = [self.fetchedResultsController objectAtIndexPath:indexPath];
        cell2.textLabel.text = drill.drillType;
        cell2.detailTextLabel.text = drill.drillDate;

        return cell2;

    
    return 0;

【问题讨论】:

另外我应该让你知道代码完全可以在没有 if 条件的情况下工作 您的问题是什么?我没有看到。 实际上,当我添加 If 条件时,此代码将不起作用。 Please let me know if my question wasn't clear enough cheers -- 什么问题? libc++abi.dylib:以 NSException 类型的未捕获异常终止 【参考方案1】:

如果您需要多个单元格,您应该使用动态调度。使用字典将单元格类型映射到键(if 语句)。这是代码

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

  NSDictionary *cellIds = @@"Grouping" : @"GroupingCellId", @"Normal" : @"NormalCellId";

  Drill *drill = [self.fetchedResultsController objectAtIndexPath:indexPath];
  NSString *CellIdentifier = cellIds[drill.drillType];

  UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
  [self configureCell:cell withObject:drill];

  return cell;

此外,如果您需要对单元格进行一些特定配置,您可以通过 2 种方式进行:

1 - 子类化 UITableViewCell 并实现进行单元格配置的方法。不同的单元将以不同的方式实现此方法。该技术称为“Polymorphism”。 Some explanation

  [cell setDrill:drill]  

2 - 根据类型进行动态调度(调用方法)。与为不同类型获取不同单元格相同的技术昵称。

NSDictionary *configMethods = @@"Grouping" : @"configGrouping", @"Normal" : @"configNormal";
NSString *method = configMethods[drill.drillType];
[self performSelector:NSSelectorFromString(method) withObject:cell withObject:drill];

【讨论】:

以上是关于从已存储的数据中管理 tableview 单元格的主要内容,如果未能解决你的问题,请参考以下文章

从已关闭的应用程序发送有关新 JSON 数据的本地通知? |迅速

从 tableView 中的 Firestore 单元格读取数据后随机重新排序

从已填充的存储中获取数据

如何在另一个视图控制器中使用核心数据编辑 Tableview 单元格数据

在 Swift 中的自定义单元格中存储/检索核心数据

TableView 单元格不显示信息