首页 > 解决方案 > 在 UITableViewCell 内,我得到旧 UIWebView 的委托回调?

问题描述

我有自定义单元格,其中有 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();
        }
    });
}

标签: iosuitableviewuiwebviewuiwebviewdelegate

解决方案


好吧,我认为您需要为您的问题提供更多背景信息。我的理解是:UITableView 中有很多单元格(我假设基于你所说的“当第二个单元格加载时”),并且每个单元格都有动态高度,具体取决于其 UIWebView 内容。如果是,那么这里有一些我找到你的代码的问题:

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

推荐阅读