我正在尝试使用X个单元格创建一个UITableView。每个单元格可以有2到20多个视图,但视图的数量不应该是硬编码的。
因此第一个UITableViewCell可能只有3个标签,而第二个UITableViewCell可能有6个标签。
我该如何实现?我只是在显示内容时遇到困难,并且UITableView的高度正确。
我目前的解决方案是在方法中生成内容(因为我无法在init方法中生成),然后在将信息传递给单元格后将子视图添加到contentView。到目前为止,这会产生不良结果(细胞的高度不能正确计算)。
这是UITableViewCell生成内容的方法。
- (void) generateContent
{
// Simplifying the code, but this section will be hooked up with a property on the UITableViewCell to generate the content
UIView *pmv = [[[NSBundle mainBundle] loadNibNamed:@"PortalModuleView"
owner:self
options:nil] objectAtIndex:0];
UIView *pmv2 = [[[NSBundle mainBundle] loadNibNamed:@"PortalModuleView"
owner:self
options:nil] objectAtIndex:0];
// add the views
[self.contentView addSubview:pmv];
[self.contentView addSubview:pmv2];
// add in some constraints
}
这是UITableView的数据源
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
// static NSString *CellIdentifier = @"Cell";
ViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[ViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
[cell generateContent];
return cell;
}
- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return 100;
}
问题是单元格没有生成我想要的内容(我认为这是由于高度不好;约束依赖于高度正确)。我认为主要原因只是在生成视图之前,单元格无法生成正确的高度。
我已尝试使用reloadRowsAtIndexPath
,但它并未修复所有行的问题。
答案 0 :(得分:0)
您必须编写自己的UITablewViewController,以编程方式处理所有这些。 UITableViewController类中有许多方法可以覆盖以修改表内容。
例如,您可以像这样更改单元格高度:
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
switch (indexPath.section)
{
case 0: // first section
{
switch (indexPath.row)
{
// first row of first section height
case 0: return 48.0f;
default: NSAssert(NO, @"Invalid row %d", (int)indexPath.row);
}
} break;
default: NSAssert(NO, @"Invalid section %d", (int)indexPath.section);
}
}
接下来,你将覆盖cellForRowAtIndexPath& willDisplayCell -functions。如果您不想以编程方式生成视图,则可以始终在storyboard-view中设计单元格原型,并以编程方式填充内容:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell* cell = nil;
NSString* cellID = nil;
switch (indexPath.section)
{
case 0: cellID = MY_CELL_ID_FOR_CELLS_IN_SECTION_1; break;
case 1: cellID = MY_CELL_ID_FOR_CELLS_IN_SECTION_2; break;
default: NSAssert(NO, @"Invalid section %d", (int)indexPath.section); break;
}
if (cellID != nil)
{
cell = [tableView dequeueReusableCellWithIdentifier:cellID];
}
return cell;
}
- (void) tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
switch (indexPath.section)
{
case 0:
{
switch (indexPath.row)
{
case 0:
{
// Say your cell prototype has label with tag=1; You can fill the content like this:
[(UILabel*)[cell viewWithTag:1] setText:@"Hello!"];
} break;
}
} break;
}
}
有关详细信息,请参阅UITableViewController class reference