我知道你不能在一个UITableView
中混合静态和动态细胞类型,但我想不出更好的方式来描述我的问题。
我有几个具有固定内容的预定细胞,我也有未知数量的具有动态内容的细胞位于中间。所以我希望我的桌子看起来像这样:
Fixed
Fixed
Fixed
Dynamic
Dynamic
Dynamic
Dynamic
Dynamic
Fixed
Fixed
那么您如何建议我使用cellForRowAtIndexPath
方法处理此问题?
感谢。
答案 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分配给这些容器并取消“启用滚动”
上的插图答案 2 :(得分:17)
经过一天的努力,找到了最佳解决方案
更新了Swift 4
对于问题的案例:
在要应用动态单元格的第二部分中添加一个空的tableview单元格,将单元格的标识符更改为WiFiTableViewCell
创建一个名为WiFiTableViewCell
在tableViewController
中的函数ViewDidLoad中注册NibtableView.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, 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)
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来保存您的动态单元格
步骤:
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)
使用动态原型正常执行tableView。 对于每个自定义单元,请使用1个原型。举一个简单的例子,我们将使用2个单元格,即AddCell和RoomCell。 AddCell在第一行,RoomCell在第二行,以及下面的任何单元格。
请记住,将numberofRowsInSection
处的计数增加适当数量的静态单元格(在这种情况下为1)。因此,如果您要返回一个数组的数目以确定行数,那么由于我们有1个静态单元格,因此在此示例中为return array.count + 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
}