Ios 在UITableViewCell中,我得到旧UIWebView的委托回调?

Ios 在UITableViewCell中,我得到旧UIWebView的委托回调?,ios,uitableview,uiwebview,uiwebviewdelegate,Ios,Uitableview,Uiwebview,Uiwebviewdelegate,我有一个自定义单元格,其中有UIWebView,根据其内容高度,我设置该行的高度。这是在我接到以下代理呼叫后完成的: - (void)webViewDidFinishLoad:(UIWebView *)webView 以下是我正在做的: - (void)webViewDidFinishLoad:(UIWebView *)webView { /* Webview content height change works only if 0.1 sec delay given */

我有一个自定义单元格,其中有UIWebView,根据其内容高度,我设置该行的高度。这是在我接到以下代理呼叫后完成的:

- (void)webViewDidFinishLoad:(UIWebView *)webView
以下是我正在做的:

- (void)webViewDidFinishLoad:(UIWebView *)webView
{
    /* Webview content height change works only if 0.1 sec delay given */

    [GlobalClass delay:^{

        webViewHeight = webView.scrollView.contentSize.height;
        // If I log this, it prints old height
        [tblOptions reloadData];

    } seconds:0.1]; 
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    switch (indexPath.section) 
    {
        case 0: {
            return webViewHeight;
        }
        case 1: {
            return UITableViewAutomaticDimension;
        }
        case 2: {
            return 60;
        }
        default:
            return 0;
    }
}
现在,若第一个单元格被加载,我得到了完美的高度(55),但当第二个单元格加载了有大量内容(800),但它给出了(55)。如果我回去的话,它应该是(55),但在那个时候,它给出(800)

简而言之,它给出了以前的高度,而不是当前的webview高度

这是我的延迟函数:

+ (void)delay:(void(^)(void))callback seconds:(double)delayInSeconds
{    
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
    dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
        if(callback){
            callback();
        }
    });
}

嗯,我认为你需要为你的问题提供更多的背景。我的理解是:UITableView中有许多单元格(我根据您所说的“第二个单元格加载时”假设),每个单元格的动态高度取决于其UIWebView内容。如果是这样的话,下面是我发现你的代码的一些问题:

  • 您正在使用单个全局变量webViewHeight返回代理heightForRowAtIndexPath(这意味着您的所有单元格都将具有此高度),这导致您获得的值不正确。要解决此问题,可以将这些值缓存到字典中
  • 我看到您在每次加载UIWebView时都会重新加载UITableView,因此如果您开始在cellForRowAtIndexPath中的某个位置加载UIWebView,可能会导致无限循环

当我们更新
UIWebView
内容时,我们应该首先将其高度重置为0或任何更小的可能值


否则,如果webview.height>实际contentHeight,它将返回webview.height而不是contentsize.height。

哪个线程是
GlobalClass.delay:
调用?感谢您的回复。。请检查我的最新答案。如果我不使用0.1秒的延迟,我仍然会遇到问题。你是说当你使用
delay:0.0
或者当你删除
GlobalClass.delay:
时,你会遇到问题吗?如果我删除
GlobalClass.delay:
,我仍然会遇到问题。在这两个场景中,我都遇到了问题。对于你的第2点,我使用BOOL,它在加载web内容时为TRUE&如果为TRUE,则不会加载任何内容。实际上,我的web视图将只有HTML字符串内容,因此它将立即加载,一旦加载,就不会进行额外的调用