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 放入viewDidLoadawakeFromNib。正如 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 只需为包含在TableViewCellStoryBoard 视图中的视图设置适当的约束。请记住,您不应该为 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 设置rowHeight

如何在 Swift 中为 UITableView 设置左右边距

Swift 在 UITableView 中为容器视图设置约束

Swift - 在 Xib 中动态设置 UITableView 高度

设置UITableView的圆角(OC和swift)

Swift:使用 prepareForSegue 将 UIView 容器的高度设置为嵌入式 UITableView 的高度