Ios 如何更改已加载的表格单元格的高度?

Ios 如何更改已加载的表格单元格的高度?,ios,uitableview,uiwebview,heightforrowatindexpath,Ios,Uitableview,Uiwebview,Heightforrowatindexpath,目前,我在自定义uitableview单元格中加载了WebView。问题是web视图的大小不一。在webViewDidFinishLoad中,我可以根据html文档的实际大小设置web视图的大小。我的问题是,在web视图完成加载之前,表单元格的高度已设置为HeightForRowatineXpath。加载表格单元格后,如何更改其高度 理想情况下,我觉得我应该能够使用这样的代码行 cellW.frame = cellW.cellWebView.frame; 但我似乎无法访问HeightForRo

目前,我在自定义uitableview单元格中加载了WebView。问题是web视图的大小不一。在webViewDidFinishLoad中,我可以根据html文档的实际大小设置web视图的大小。我的问题是,在web视图完成加载之前,表单元格的高度已设置为HeightForRowatineXpath。加载表格单元格后,如何更改其高度

理想情况下,我觉得我应该能够使用这样的代码行

cellW.frame = cellW.cellWebView.frame;
但我似乎无法访问HeightForRowatineXpath中的手机信息。我觉得我已经很好地解释了这个情况,但是你认为我应该发布的任何代码我都可以放在这里。我尝试了很多东西(因此到处都有评论和失败的尝试),但主要的问题是我似乎无法在正确的位置访问单元格信息,例如heightForRowAtIndexPath。如果我甚至可以在webViewDidFinishLoad中以某种方式设置单元格信息,我可以简单地设置单元格的框架,在这里我还可以设置web视图的框架大小

下面是我的表格单元格子类的设置

#import <UIKit/UIKit.h>
#import "DefinitionsAndConstants.h"

@interface UITableViewCellWebView : UITableViewCell
{
    UIWebView *cellWebView;
}

@property (nonatomic,retain) UIWebView *cellWebView;
@end

对于heightForRowAtIndexPath方法,您应该能够执行以下操作:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    MyTableViewCell *tableCell = (MyTableViewCell *)[self.tableView cellForRowAtIndexPath:indexPath];

    if (tableCell) {
        return tableCell.cellWebView.frame.size.height;
    }

    return 44;
}
这样,如果表格单元格可见,它将根据嵌入的web视图的高度设置高度,否则将使用默认高度。为了使表格视图刷新单元格的高度,一旦web视图大小正确,您必须调用以下命令:

[self.tableView beginUpdates];
[self.tableView endUpdates];

这不会让它重新加载单元格,这可能会让你把事情搞砸,它只会让它再次检查高度,单元格高度将被设置为新的高度。

我会设置一个可变数组来读取高度。在
viewDidLoad
中,您必须指定一些起始值(可能只是一堆
@“44.0”
,这并不重要,它还不会被大量使用)。在您的
高度FORROWATINDEXPATH:
中,只需返回该数组中的数字。然后在
webViewDidFinishLoad
中,将数组中的高度替换为该单元格实际需要的高度(我相信您发布的代码中的
NSString*h
),然后在表视图上调用
reloadData
reloadData
将点击
heightForRowAtIndexPath:
,它将查看heights数组,该数组现在具有该单元格所需的实际高度,因此所有内容都应该是闪亮的。

我确实发现了与此相关的其他问题,但它们似乎都没有涉及动态单元格高度。您在哪里加载Web视图?如果您只是在
viewDidLoad
中执行,那么应该在绘制表格之前完成加载,对吗?抱歉,如果这是一个愚蠢的问题-我以前没有使用过webviews。web视图在那里加载,但在HeightForRowatineXpath执行后webViewDidFinishLoad完成之前,它们不会完成内容的呈现。所以在webViewDidFinishLoad之前不会计算内容的高度。这看起来正是我需要的。但是UITableViewCellWebView*tableCell=(UITableViewCellWebView*)[self.tableView cellForRowAtIndexPath:indexPath];不断返回EXC\u BAD\u访问权限。我对其中一些问题还不熟悉,但我猜这是一个迹象,表明我有一些更深层次的问题需要首先解决。感谢您的帮助。
UITableViewCellWebView
是您的
UITableViewCell
子类,还是属于
UIWebView
的子类?它是UITableViewCell子类。我在问题中发布了我的子类。显然,调用CellForRowatineXpath:inside HeightForRowatineXpath:会导致它递归调用HeightForRowatineXpath:,这就是它崩溃的原因。详细信息请在每个索引路径中分别保留一个为web视图计算的高度表,并使用该表来获取此处的高度。我喜欢这个想法,我只是尝试了一下,但由于我怀疑重新加载数据会重新绘制单元格并使web视图再次渲染,从而导致无限循环。由于web视图仅在单元格可见时渲染,向下滚动会进一步导致更疯狂的无限循环。视图看起来大部分是正确的,但是在无限循环不可避免地崩溃之前,视图是不稳定的。我想我可能需要说,当数组中的正确行已经被填充时,不要重新加载数据。我会再测试一些,让你知道它是如何运行的。@Caimen:Hm,你需要在
cellforrowatinexpath:
中重新绘制网络视图吗?当用户与它交互时,它是否会发生变化?我需要临时构建
viewDidLoad
中的所有单元格,将它们放入一个数组中,然后将该单元格从
cellforrowatinexpath:
的数组中拉出,而不是使用
reuseIdentifier
s。似乎我在表格视图方面获得的经验越多,我就越喜欢一次构建单元格,然后再使用它(而不是像我需要的那样在
cellforrowatinexpath
中构建它们).我现在停止了无限循环,只需检查数组中的正确节点,并且在设置值后不重新加载视图。目前有一些无法解释的空白显示,但我相当肯定你把我放在了正确的轨道上。一旦我完全确信解决方案工作正常,我可能会在明天检查它是否正确。谢谢你的帮助。我不明白,你是如何用无限的looop解决这个问题的?
[self.tableView beginUpdates];
[self.tableView endUpdates];