我知道您不能将静态和动态单元格类型混合在一起,UITableView
但我想不出更好的方法来描述我的问题。
我有几个具有固定内容的预定单元格,我还有未知数量的具有动态内容的单元格位于中间。所以我想让我的桌子看起来像这样:
Fixed
Fixed
Fixed
Dynamic
Dynamic
Dynamic
Dynamic
Dynamic
Fixed
Fixed
那么你究竟如何建议我在我的cellForRowAtIndexPath
方法中处理这个?
谢谢。
我知道您不能将静态和动态单元格类型混合在一起,UITableView
但我想不出更好的方法来描述我的问题。
我有几个具有固定内容的预定单元格,我还有未知数量的具有动态内容的单元格位于中间。所以我想让我的桌子看起来像这样:
Fixed
Fixed
Fixed
Dynamic
Dynamic
Dynamic
Dynamic
Dynamic
Fixed
Fixed
那么你究竟如何建议我在我的cellForRowAtIndexPath
方法中处理这个?
谢谢。
经过1天的努力,找到了最佳解决方案
为 Swift 4 更新
对于问题的情况:
在要应用动态单元格的第二部分中添加一个空的 tableview 单元格,将单元格的标识符更改为WiFiTableViewCell
创建一个名为的新 XIB 文件WiFiTableViewCell
在 tableViewController 的函数 ViewDidLoad 中注册 Nib
tableView.register(UINib(nibName: "WiFiTableViewCell", bundle: nil), forCellReuseIdentifier: "WiFiTableViewCell")
添加以下代码以同时使用动态和静态单元格
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)
}
正如您所说,您不能混合静态和动态单元格。但是,您可以将内容分解为对应于每个组的不同数据数组。然后将表格分成不同的部分,并从 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) 在动态 TableView 的页眉和页脚中放置两个容器视图 2) 将静态 TableViews 分配给这些容器并取消勾选“启用滚动”
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];
希望这会有所帮助,如果您有任何问题,请告诉我。
添加一个新的隐藏 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
}
使用动态原型正常实现您的 tableView。对于每个自定义单元格,使用 1 个原型。举个简单的例子,我们将使用 2 个单元格,AddCell 和 RoomCell。AddCell 在第一行,RoomCell 在第二行和下面的任何单元格。
请记住将计数增加numberofRowsInSection
适当数量的静态单元格(在本例中为 1)。因此,如果您要返回数组的计数来确定行数,那么return array.count + 1
对于这个示例来说,因为我们有 1 个静态单元格。
我通常也会为每个单元格创建一个自定义类。这通常会使在 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
}