swift UITableView 设置rowHeight
Posted
技术标签:
【中文标题】swift UITableView 设置rowHeight【英文标题】:swift UITableView set rowHeight 【发布时间】:2014-10-27 06:00:17 【问题描述】:我正在尝试使用此代码将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)
【问题讨论】:
EXC_BAD_ACCESS in heightForRowAtIndexPath ios的可能重复 您不得在heightForRowAtIndexPath
内调用cellForRowAtIndexPath
。 EXC_BAD_ACCESS 是由深度递归引起的堆栈溢出引起的。
我应该从哪里调用 CellForRowAtIndexPath?
heightForRowAtIndexPath
必须从数据源计算单元格的高度,而不加载单元格本身。
【参考方案1】:
设置行高有单独的方法:
对于 Swift 3
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat
return 100.0;//Choose your custom row height
较旧的 Swift 使用
func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat
return 100.0;//Choose your custom row height
否则您可以使用以下方法设置行高:
self.tableView.rowHeight = 44.0
在ViewDidLoad中。
【讨论】:
如果你使用的是 Swift 3.0 你必须使用这个函数:func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat
嗨 刚刚尝试使用这个函数,Xcode 9 beta 6 建议覆盖所以正确的签名是覆盖 func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat【参考方案2】:
将默认的rowHeight
放入viewDidLoad
或awakeFromNib
。正如 Martin R. 所指出的,您不能从 heightForRowAtIndexPath
调用 cellForRowAtIndexPath
self.tableView.rowHeight = 44.0
【讨论】:
【参考方案3】:yourTableView.rowHeight = UITableViewAutomaticDimension
试试这个。
【讨论】:
UITableView.automaticDimension【参考方案4】:func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat
var height:CGFloat = CGFloat()
if indexPath.row == 1
height = 150
else
height = 50
return height
【讨论】:
【参考方案5】:正如 cmets 中所指出的,您不能在 heightForRowAtIndexPath
内调用 cellForRowAtIndexPath
。
您可以做的是创建一个模板单元格,用于填充您的数据,然后计算其高度。 该单元格不参与表格渲染,可以重复使用计算每个表格单元格的高度。
简而言之,它包括使用您要显示的数据配置模板单元格,使其根据内容调整大小,然后读取其高度。
我从我正在处理的一个项目中获取了这段代码 - 不幸的是,它是在 Objective C 中,我认为你在转换为 swift 时不会遇到问题
- (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;
【讨论】:
这可行,但在您滚动时会产生很多约束错误。 这在我的情况下没有发生,我使用了自动布局。 @Antonio 你能帮忙把它翻译成 Swift 吗? Here 是我尝试过的,但得到的结果不正确。 您好,如果您为此创建一个问题会更好 - 同时扩展“得到不正确的结果”,以便更好地了解哪些工作不正常。不要忘记在此处发布链接。【参考方案6】:问题原因:
问题是尚未创建单元格。 TableView 首先计算行的高度,然后为每一行填充数据,因此在调用 heightForRow 方法时还没有创建行数组。因此,您的应用程序正在尝试访问它没有权限的内存位置,因此您会收到 EXC_BAD_ACCESS
消息。
如何在UITableView
中实现自我调整TableViewCell
:
只需为包含在TableViewCell
的StoryBoard
视图中的视图设置适当的约束。请记住,您不应该为 TableViewCell 的根视图设置高度约束,它的高度应该可以通过其子视图的高度正确计算——这就像您为UIScrollView
设置适当的约束一样。这样,您的单元格将根据其子视图获得不同的高度。无需额外操作
【讨论】:
【参考方案7】:确保您的 TableView 委托也正常工作。 如果不是那么 在您的故事板或 .xib 中 按住 Control + 右键单击 tableView 拖放到您的当前 ViewController。 swift 2.0
func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat
return 60.0;
【讨论】:
【参考方案8】:无法从 tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) 中调用 tableView.dequeueReusableCell。
所以你必须根据数据计算高度。 在我的情况下这是不可能的,因为我在单元格中有一个 textView,我不知道它的大小。
所以我想出了以下策略:
不要使用 tableView.dequeueReusableCell。只需使用您完全控制的一组单元格。如果您的单元格在内存中不是太大并且您没有太多行,这是最简单的策略。
使用虚拟单元,使用您的数据对其进行配置并计算大小。
【讨论】:
【参考方案9】:尝试将这样的代码复制并粘贴到类中
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat
return 100
【讨论】:
这如何提高投票率?看起来像我的副本 这对我来说似乎是一个副本,其他答案有相同的文字以上是关于swift UITableView 设置rowHeight的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Swift 中为 UITableView 设置左右边距
Swift 在 UITableView 中为容器视图设置约束
Swift - 在 Xib 中动态设置 UITableView 高度
Swift:使用 prepareForSegue 将 UIView 容器的高度设置为嵌入式 UITableView 的高度