【问题标题】:swift UITableView set rowHeightswift UITableView 设置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)

【问题讨论】:

  • 您不得在heightForRowAtIndexPath 内调用cellForRowAtIndexPath。 EXC_BAD_ACCESS 是由深度递归引起的堆栈溢出引起的。
  • 我应该从哪里调用 CellForRowAtIndexPath?
  • heightForRowAtIndexPath 必须从数据源计算单元格的高度,而不加载单元格本身。

标签: xcode swift uitableview


【解决方案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,我不知道它的大小。

          所以我想出了以下策略:

          1. 不要使用 tableView.dequeueReusableCell。只需使用您完全控制的一组单元格。如果您的单元格在内存中不是太大并且您没有太多行,这是最简单的策略。

          2. 使用虚拟单元,使用您的数据对其进行配置并计算大小。

          【讨论】:

            【解决方案9】:

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

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

            【讨论】:

            • 这如何提高投票率?看起来像我的副本
            • 这对我来说似乎是一个副本,其他答案有相同的文字
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2014-11-11
            • 2014-08-21
            • 2020-09-16
            • 2012-09-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多