【问题标题】:How to create a grouped table view with multiple cell types?如何创建具有多种单元格类型的分组表视图?
【发布时间】:2013-04-02 14:00:59
【问题描述】:

我没有使用故事板,它是 iOS 6。

当所有单元格都是相同类型时,我知道该怎么做,但我需要一个包含多种单元格类型的分组表视图。举个例子,假设第一个单元格需要是UITableViewCellStyleValue1,第二个单元格需要是UITableViewCellStyleSubtitle,第三个单元格是自定义单元格(UITableViewCell 子类,它有一个 xib,因此可以使用与registerNib:forCellReuseIdentifier:

主要是我不确定构建tableView:cellForRowAtIndexPath: 的最佳方式。但我不确定是否应该注册自定义单元格或全部。

最好的方法是什么?

【问题讨论】:

  • 我猜这是一个可变长度表,而静态表不能满足您的需求?您提到有一个单独的 XIB 文件用于自定义单元格布局。您可以在与表格相同的 XIB 中创建自定义单元格,并在那里设置重用标识符。它更容易并且适用于许多情况。你有什么不适合你的特殊情况吗?
  • @DBD 我已经编辑了问题以表明它是静态的。我不认为我在为自定义单元格设置重用标识符的位置而苦苦挣扎,但如果这是解决方案,请详细说明。
  • @DBD 另外,我在许多其他地方都在使用该自定义单元格,因此最好有自己的 xib 文件。如果我错了,请纠正我。

标签: ios objective-c uitableview


【解决方案1】:

你走在正确的道路上。由于您的自定义单元格正在其他地方使用,因此 xib 是加载它的好地方。至于实现,你可以做这样的事情。

假设您的表格视图是“静态的”并且有三个单元格,您可以在 viewDidLoad 中注册您的自定义笔尖:

- (void)viewDidLoad
{
    [super viewDidLoad];

    UINib *customCellNib = [UINib nibWithNibName:@"CustomCell" bundle:nil];
    [self.tableView registerNib:customCellNib forCellReuseIdentifier:@"CustomIdentifier"]
}

然后在cellForRowAtIndexPath:

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

    UITableViewCell *cell = nil;

    if(indexPath.row == 0) {

        cell = [tableView dequeueReusableCellWithIdentifier:@"CellIdentifier1"];

        if(cell == nil) {

            cell = [[UITableViewCell alloc]  initWithStyle:UITableViewCellStyleValue1
                                           reuseIdentifier:@"CellIdentifier1"];
        }
    }
    /* Cell 2 ommited for brevity */
    else if(indexPath.row == 2) {

        //Just to demonstrate the tableview is returning the correct type of cell from the XIB
        CustomCell *customCell = [tableView dequeueReusableCellWithIdentifier:@"CustomIdentifier"];
        cell = customCell;
    }

    [self configureCell:cell atIndexPath:indexPath];

    return cell;
}

最后在 IB 中为 Xib 设置正确的Identifier 为单元格。

更新

- (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath {

    if(indexPath.row == 0) {
        cell.textLabel.text = [NSString stringWithFormat:@"Cell %d", indexPath.row];
    }
    else {

        //custom cell here
        //cell.textfield.text = @"blah blah";
    }
}

配置单元格方法在某种程度上是用于主要使用NSFetchedResultsController(及其使用的delegate)放置的表格视图单元格的约定

这只是用适当的内容重置重复使用的单元格的一种便捷方法,并使cellForRowAtIndexPath: 更易于阅读。我什至制作了多个版本的 configureCell,例如 configureCustomCell1:atIndexPath,以进一步提高可读性。

希望这会有所帮助!

【讨论】:

  • 是的,很有帮助!在xib中为自定义单元格设置Identifier有什么好处?
  • 您能否也显示configureCell:atIndexPath: 的代码?我假设它的方法签名是这样的:- (UITableViewCell *)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath。一旦进入那里,CustomCell 怎么知道它是 CustomCell?使用演员表?这样做的最佳方式/地点是什么?
  • 其实很有趣的问题,为什么要在 IB 中设置 Identifier?据我所知,在这种情况下您不需要这样做,因为您使用的是registerNib:forCellReuseIdentifier:。 tablview 在没有设置标识符的情况下正确地重用这些单元格。如果您使用其他各种较旧的方法之一从 xib 中提取单元格,您可能需要设置它。我很快就会用 configureCell 实现更新我的答案。
  • 我必须在 configureCell:atIndexPath:if (indexPath.section == sectionWithCustomCells) {CustomCell *customCell = (CustomCell *)cell; ...
【解决方案2】:

如果您使用的是静态表,则不需要重用标识符或其他任何东西,因为不会再使用任何单元格。只需将表格设置为“分组”样式的“静态单元格”并设置所需的部分数。您可以单击“表格视图部分”并设置该部分中的行数(并设置您可能需要的任何页眉/页脚)。

然后根据需要配置单元格。您可以选择默认单元格或将单元格设为“自定义”并从对象库中拖动 UI 组件。您可以为静态表格单元格中的组件设置IBOutletsIBActions,就像在普通视图中设置组件一样。

【讨论】:

  • 我没有看到 Content: Static CellsSections: 我没有使用 Storyboard。这有区别吗?
  • 但是我可以为这个表格视图使用故事板吗?
  • 要创建静态表,您需要使用情节提要。您可以轻松地创建一个包含单个视图控制器的故事板,但您不能在故事板中创建一个没有视图控制器的视图。
  • 感谢您的努力,但我不愿意接受答案,因为我希望有人可以解释如何仅使用 xibs 来做到这一点。
  • 这丝毫不影响我。遗憾的是,XIB 不支持静态表格视图。您可以创建一个带有“视图”的 XIB,即您的 UITableView 和更多视图,即您的 UITableViewCells,并使用标准重用系统将它们全部加载(即使没有真正被重用)。
猜你喜欢
  • 1970-01-01
  • 2016-12-29
  • 2014-12-02
  • 1970-01-01
  • 1970-01-01
  • 2019-08-23
相关资源
最近更新 更多