Xcode swift UITableView设置行高

Xcode swift UITableView设置行高,xcode,swift,uitableview,Xcode,Swift,Uitableview,我试图将表格视图中每一行的高度设置为具有此代码的相应单元格的高度: override func tableView(tableView: UITableView!, heightForRowAtIndexPath indexPath: NSIndexPath!) -> CGFloat { var cell = tableView.cellForRowAtIndexPath(indexPath) return cell.frame.height } 初始化变量单元格

我试图将
表格视图中每一行的高度设置为具有此代码的相应单元格的高度:

override func tableView(tableView: UITableView!, heightForRowAtIndexPath indexPath: NSIndexPath!) -> CGFloat {
      var cell = tableView.cellForRowAtIndexPath(indexPath)
      return cell.frame.height
}
初始化变量单元格时出现此错误:

线程1:EXC\U错误访问(代码=2,地址=0x306d2c)


将默认的
rowHeight
放入
viewDidLoad
awakeFromNib
中。正如Martin R所指出的,您不能从
heightforrowatinexpath

self.tableView.rowHeight = 44.0

正如注释中指出的,您不能在
高度for rowatinexpath
内调用
cellforrowatinexpath

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

简单地说,它包括使用要显示的数据配置模板单元格,使其根据内容调整大小,然后读取其高度

我从我正在从事的一个项目中获取了这段代码——不幸的是,它在目标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;
}

设置行高有单独的方法:

对于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
视图中加载

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代理也在工作。 如果没有,那么 在您的故事板中或在.xib中 按住Control键并右键单击tableView,将其拖放到当前的ViewController。 swift 2.0

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

问题原因:
问题是单元尚未创建。TableView首先计算行的高度,然后填充每行的数据,因此在调用heightForRow方法时尚未创建行数组。因此,您的应用程序正在尝试访问其无权访问的内存位置,因此您会收到
EXC\u BAD\u access
消息

如何在
UITableView
中实现自我调整
TableViewCell


只需为
序列图像板中的
TableViewCell
视图中包含的视图设置适当的约束即可。请记住,您不应该为TableViewCell的根视图设置高度约束,它的高度应该可以通过其子视图的高度正确计算——这就像为
UIScrollView
设置适当约束一样。这样,单元格将根据其子视图获得不同的高度。无需其他操作

您不能从
高度为rowatinexpath
内调用
cellforrowatinexpath
。EXC\u BAD\u访问是由深度递归导致的堆栈溢出造成的。我应该从何处调用CellForRowatineXpath?
HeightForRowatineXpath
必须从数据源计算单元格的高度,而不加载单元格本身。这可以工作,但在滚动时会产生大量约束错误。在我的情况下没有发生这种情况,我使用了autolayout。@Antonio你能帮我把它翻译成Swift吗?这是我尝试过的,但是得到了不正确的结果。我认为如果你为此提出一个问题会更好——同时扩展“得到不正确的结果”,以便更好地理解什么不正常工作。不要忘记在这里发布链接。如果您使用的是Swift 3.0,则必须使用此func:
func tableView(\uTableView:UITableView,heightForRowAt indexPath:indexPath)->CGFloat
Hi刚刚尝试使用此函数,Xcode 9 beta 6建议重写,因此正确的签名是override func tableView(\uTableView:UITableView,HightForRowat indexPath:indexPath)->CGFloat这是如何改进向上投票的答案的?看起来方法的副本对我来说似乎是副本,其他答案具有相同的textUITableView.automaticDimension