快速 UITableView 设置 rowHeight

我尝试用这段代码将 tableView中每一行的高度设置为相应单元格的高度:

override func tableView(tableView: UITableView!, heightForRowAtIndexPath indexPath: NSIndexPath!) -> CGFloat {
var cell = tableView.cellForRowAtIndexPath(indexPath)
return cell.frame.height
}

我在初始化 var cell时得到这个错误:

线程1: EXC _ BAD _ ACCESS (code = 2,address = 0x306d2c)

170217 次浏览

把默认的 rowHeight放在 viewDidLoadawakeFromNib中。正如 Martin R 所指出的,你不能从 heightForRowAtIndexPath调用 cellForRowAtIndexPath

self.tableView.rowHeight = 44.0

正如注释中指出的,不能在 heightForRowAtIndexPath中调用 cellForRowAtIndexPath

您可以做的是创建一个用于填充数据的模板单元格,然后计算其高度。 此单元格不参与表呈现,可以重用它来计算每个表单元格的高度。

简而言之,它包括使用希望显示的数据配置模板单元格,根据内容调整单元格的大小,然后读取其高度。

我已经采取了这个项目的代码,我正在工作-不幸的是,它的目标 C,我不认为你会有问题转换为迅速

- (CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
static PostCommentCell *sizingCell = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sizingCell = [self.tblComments dequeueReusableCellWithIdentifier:POST_COMMENT_CELL_IDENTIFIER];
});


sizingCell.comment = self.comments[indexPath.row];
[sizingCell setNeedsLayout];
[sizingCell layoutIfNeeded];


CGSize size = [sizingCell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize];
return size.height;
}

对于设置行高,有单独的方法:

对于 Swift 3

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return 100.0;//Choose your custom row height
}

旧的 斯威夫特使用

func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
return 100.0;//Choose your custom row height
}

否则,可以使用以下方法设置行高:

self.tableView.rowHeight = 44.0

ViewDidLoad

yourTableView.rowHeight = UITableViewAutomaticDimension

试试这个。

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
var height:CGFloat = CGFloat()
if indexPath.row == 1 {
height = 150
}
else {
height = 50
}
return height
}

尝试像这样的代码复制并粘贴到类中

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return 100
}

确保 TableView 委托也能正常工作。 如果不是的话 在你的故事板或在 按住 Control + 右键单击 tableView 拖放到当前 ViewController。 Swift 2.0

func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
return 60.0;
}

问题原因:
问题是还没有创建单元格。TableView 首先计算行的高度,然后填充每行的数据,因此在调用 heightForRow 方法时尚未创建行数组。因此,你的应用程序试图访问一个内存位置,它没有权限,因此你得到的 EXC_BAD_ACCESS消息。

如何在 UITableView中实现 TableViewCell的自我上浆:
只需为 StoryBoardTableViewCell视图中包含的视图设置适当的约束即可。请记住,不应该为 TableViewCell 的根视图设置高度约束,它的高度应该通过子视图的高度来适当地计算——这就像为 UIScrollView设置适当的约束一样。通过这种方式,你的细胞将根据它们的子视图获得不同的高度。不需要额外的行动

无法从 tableView (_ tableView: UITableView,heightForRowAt indexPath: IndexPath)内调用 tableView.dequeue eReusableCell。

所以你必须从数据中计算出高度。 在我的例子中,这是不可能的,因为我在单元格中有一个 textView,我不知道它的大小。

所以我有以下策略:

  1. 不要使用 tableView.dequeue eReusableCell。只要使用你完全可以控制的细胞阵列。如果您的单元格在内存中不太大,并且没有太多行,那么这是最简单的策略。

  2. 使用一个虚拟单元格,配置它与您的数据和计算的大小。