43

我知道您不能将静态和动态单元格类型混合在一起,UITableView但我想不出更好的方法来描述我的问题。

我有几个具有固定内容的预定单元格,我还有未知数量的具有动态内容的单元格位于中间。所以我想让我的桌子看起来像这样:

Fixed
Fixed
Fixed
Dynamic
Dynamic
Dynamic
Dynamic
Dynamic
Fixed
Fixed

那么你究竟如何建议我在我的cellForRowAtIndexPath方法中处理这个?

谢谢。

4

6 回答 6

32

经过1天的努力,找到了最佳解决方案

为 Swift 4 更新

对于问题的情况:

  1. 将 tableView 的部分设置为 3

在此处输入图像描述

  1. 在要应用动态单元格的第二部分中添加一个空的 tableview 单元格,将单元格的标识符更改为WiFiTableViewCell

  2. 创建一个名为的新 XIB 文件WiFiTableViewCell

在此处输入图像描述

  1. 在 tableViewController 的函数 ViewDidLoad 中注册 Nib

    tableView.register(UINib(nibName: "WiFiTableViewCell", bundle: nil), forCellReuseIdentifier: "WiFiTableViewCell")
    
  2. 添加以下代码以同时使用动态和静态单元格

    override func numberOfSections(in tableView: UITableView) -> Int 
    {
        return 3
    }
    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        if section == 1 {
            return self.dataSource.count
            //the datasource of the dynamic section
        }
        return super.tableView(tableView, numberOfRowsInSection: section)
     }
    
    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        if indexPath.section == 1 {
            let cell = tableView.dequeueReusableCell(withIdentifier: "WiFiTableViewCell") as! WiFiTableViewCell
            return cell
        }
        return super.tableView(tableView, cellForRowAt: indexPath)
    }
    
     override func tableView(_ tableView: UITableView, indentationLevelForRowAt indexPath: NSIndexPath) -> Int {
         if indexPath.section == 1 {
             let newIndexPath = IndexPath(row: 0, section: indexPath.section)
             return super.tableView(tableView, indentationLevelForRowAt: newIndexPath)
         }
         return super.tableView(tableView, indentationLevelForRowAt: indexPath)
     }
    
     override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
         if indexPath.section == 1 {
             return 44
         }
         return super.tableView(tableView, heightForRowAt: indexPath)
      }
    
于 2018-03-07T16:57:03.440 回答
27

正如您所说,您不能混合静态和动态单元格。但是,您可以将内容分解为对应于每个组的不同数据数组。然后将表格分成不同的部分,并从 cellForRowAtIndexPath: 中的正确数组加载数据。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *cellID = @"CELLID";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellID forIndexPath:indexPath];

    switch (indexPath.section) {
        case 0:{
            cell.textLabel.text = self.arrayOfStaticThings1[indexPath.row];
        }break;

        case 1:{
            cell.textLabel.text = self.arrayOfDynamicThings[indexPath.row];
        }break;

        case 2:{
            cell.textLabel.text = self.arrayOfStaticThings2[indexPath.row];
        }break;

        default:
            break;
    }

    return cell;
}



- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    switch (section) {
        case 0:{
            return self.arrayOfStaticThings1.count;
        }break;

        case 1:{
            return self.arrayOfDynamicThings.count;
        }break;

        case 2:{
            return self.arrayOfStaticThings2.count;
        }break;

        default:
            return 0;
            break;
    }
}
于 2013-08-09T19:06:18.190 回答
20

最好和最简单的方法

1) 在动态 TableView 的页眉和页脚中放置两个容器视图 2) 将静态 TableViews 分配给这些容器并取消勾选“启用滚动”

请在https://stackoverflow.com/a/22524085/1537178查看我的插图

于 2014-02-04T05:34:44.100 回答
11

在 Storeboard 中混合动态和静态表视图

suraj k thomas,看看我的这个结构,效果很好。@firecast我没有在这个项目中使用约束,但是我确实根据容器的tableview高度设置了容器的高度,如下所示:

    ContainerViewController *containerVC = self.childViewControllers.firstObject;
    CGRect frame = self.containerView.frame;
    frame.origin.x = 0;
    frame.origin.y = 0;
    frame.size.width = self.tableView.frame.size.width;
    frame.size.height = containerVC.tableView.contentSize.height;
    self.containerView.frame = frame;
    [self.tableView setTableHeaderView:self.containerView];

希望这会有所帮助,如果您有任何问题,请告诉我。

于 2014-03-20T05:20:18.890 回答
3

添加一个新的隐藏 UITableView 保存您的动态单元格

在此处输入图像描述

脚步:

1-在你的主要UITableViewController追加新Section的最后,在这个里面Section只添加一个UITableViewCell,在单元格内插入一个新UITableView的。让我们调用新表tblPrototypes,因为它将是原型单元格的持有者。

2- 现在将类型设置tblPrototypes为 Dynamic Prototypes,然后根据UITableViewCell需要添加尽可能多的原型。

3-tblPrototypes在 Main Static 的主控制器中添加一个 Outlet UITableView,让我们调用它tablePrototypes,当然它是类型UITableView

编码部分:

首先确保tblPrototypes从 UI 中隐藏,因为它是主表中的最后一部分,您可以这样做:

@IBOutlet weak var tblPrototypes: UITableView!

override func numberOfSections(in tableView: UITableView) -> Int {
    return super.numberOfSections(in: tableView) - 1
}

最后一节将不介绍。

现在,当您想要显示动态单元格时,您可以这样做:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

  let needDynamic = true

  if !needDynamic {
    return super.tableView(tableView, cellForRowAt: indexPath)
  }

  let cellId = "dynamicCellId1"
  let cell = self.tblPrototypes.dequeueReusableCell(withIdentifier: cellId, for: indexPath)
  // configure the cell

  return cell

}
于 2018-10-01T09:45:50.890 回答
0
  1. 使用动态原型正常实现您的 tableView。对于每个自定义单元格,使用 1 个原型。举个简单的例子,我们将使用 2 个单元格,AddCell 和 RoomCell。AddCell 在第一行,RoomCell 在第二行和下面的任何单元格。

  2. 请记住将计数增加numberofRowsInSection适当数量的静态单元格(在本例中为 1)。因此,如果您要返回数组的计数来确定行数,那么return array.count + 1对于这个示例来说,因为我们有 1 个静态单元格。

  3. 我通常也会为每个单元格创建一个自定义类。这通常会使在 View Controller 中配置单元格变得更简单,并且是分离代码的好方法,但它是可选的。下面的示例为每个单元格使用自定义类。如果不使用自定义类,请将 if let 语句替换为不带可选转换的 if 语句。

注意:configureCell下面是自定义类RoomCell中动态配置单元格的方法

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    if indexPath.row == 0 {
        if let cell =  tableView.dequeueReusableCell(withIdentifier: "AddCell", for: indexPath) as? AddCell {
            return cell
        }
    } else {
        if let cell = tableView.dequeueReusableCell(withIdentifier: "RoomCell", for: indexPath) as? RoomCell {
            cell.configureCell(user: user, room: room)
            return cell
        }
    }
    return UITableViewCell() //returns empty cell if something fails
}
于 2019-10-05T12:49:57.633 回答