在UITableViewCell内,我正在获取旧UIWebView的委托回调吗?

时间:2019-02-14 11:49:40

标签: 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 */

    [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();
        }
    });
}

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

否则,如果webview.height>实际的contentHeight,它将返回webview.height,但不会返回contentsize.height。