UITableView混合静态和动态单元?

时间:2013-08-09 18:54:23

标签: ios objective-c uitableview

我知道你不能在一个UITableView中混合静态和动态细胞类型,但我想不出更好的方式来描述我的问题。

我有几个具有固定内容的预定细胞,我也有未知数量的具有动态内容的细胞位于中间。所以我希望我的桌子看起来像这样:

Fixed
Fixed
Fixed
Dynamic
Dynamic
Dynamic
Dynamic
Dynamic
Fixed
Fixed

那么您如何建议我使用cellForRowAtIndexPath方法处理此问题?

感谢。

6 个答案:

答案 0 :(得分:22)

如你所说,你不能混合静态和动态细胞。但是,您可以做的是将内容分解为与每个组对应的不同数据阵列。然后将表拆分为差异部分,并从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;
    }
}

答案 1 :(得分:18)

最佳和最轻松的方式

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

请查看https://stackoverflow.com/a/22524085/1537178

上的插图

答案 2 :(得分:17)

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

更新了Swift 4

对于问题的案例:

  1. 将tableView的各个部分设置为3
  2. enter image description here

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

    2. 创建一个名为WiFiTableViewCell

    3. 的新XIB文件

      enter image description here

      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, indentationLevelForRowAtIndexPath 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)
          }
        

答案 3 :(得分:11)

Mixing Dynamic and Static tableviews in 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];

希望这有帮助,如果您有任何疑问,请与我联系。

答案 4 :(得分:3)

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

enter image description here

步骤:

1-在您的主UITableViewController末尾附加新的Section, 在此Section内仅添加一个UITableViewCell, 在单元格中插入新的UITableView。 让我们将新表称为 tblPrototypes ,因为 它将是原型单元的所有者。

2-现在将 tblPrototypes 的类型设置为动态原型, 然后根据需要添加任意数量的原型UITableViewCell

3-在主静态tblPrototypes的主控制器中为 UITableView 添加插座, 我们称之为tablePrototypes,当然它的类型为UITableView

编码部分:

首先请确保在用户界面中隐藏tblPrototypes, 由于它是主表中的最后一部分,因此您可以执行以下操作:

@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

}

答案 5 :(得分:0)

  1. 使用动态原型正常执行tableView。 对于每个自定义单元,请使用1个原型。举一个简单的例子,我们将使用2个单元格,即AddCell和RoomCell。 AddCell在第一行,RoomCell在第二行,以及下面的任何单元格。

  2. 请记住,将numberofRowsInSection处的计数增加适当数量的静态单元格(在这种情况下为1)。因此,如果您要返回一个数组的数目以确定行数,那么由于我们有1个静态单元格,因此在此示例中为return array.count + 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
}