【问题标题】:heightForRowAtIndexPath before webViewDidFinishLoadwebViewDidFinishLoad 之前的 heightForRowAtIndexPath
【发布时间】:2011-08-22 10:19:27
【问题描述】:

我需要在表格视图的单元格中加载 HTML。我正在使用 UIWebView 而不是 UILabel 以便解释 html 标签。 WebView的大小不同,所以我在做

- (void)webViewDidFinishLoad:(UIWebView *)webView {
   [webView sizeToFit];
}

以便正确设置 webview 的大小。但是,我还需要定义单元格的高度,我打算在里面设置它

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
}

不幸的是,heightForRowAtIndexPath 在 webViewDidFinishLoad 之前被调用,所以我无法正确定义单元格的高度。

对我的问题有什么建议吗?我发现了一个关于这个的老问题,但它对我没有帮助:How to determine UIWebView height based on content, within a variable height UITableView?

谢谢,

阿德里安娜

【问题讨论】:

  • 重新考虑你的设计——将 UIWebView 放在 UITableView 中通常是一个坏主意,原因有很多,包括: (UITableView 需要在显示之前知道,UIWebView 需要等到所有东西都加载完之后才知道)
  • 那我应该用什么来代替 UIWebView?我需要显示 HTML。
  • 我同意 7KV7,你至少应该尝试通过不同的方法来思考。我怀疑您的 html 是一个典型的公共网页,因为您将它们放在表格单元格中。看起来更像是您可能对 html 有一些控制权,否则它将永远无法工作。你能解析这个 html 并用它来构建单元格吗?这里有很多猜测 - 这取决于 html、谁/如何控制它等。 UIWebView 真的很重。它可能滚动得不是很好。

标签: iphone uitableview uiwebview


【解决方案1】:

我找到了解决问题的方法。我需要在 tableview 的末尾有一个 webview,所以我做了以下操作:

- (void)viewWillAppear:(BOOL)animated {

    CGRect frame = CGRectMake(10, 0, 280, 400);
    webView = [[UIWebView alloc] initWithFrame:frame];
    self.webView.delegate = self;
    webView.hidden = YES;

    //It removes the extra lines from the tableview.
    [self.tableView setTableFooterView:self.webView];
    ...
}

- (void)webViewDidFinishLoad:(UIWebView *)webView {
    [webView sizeToFit];
    [webView setBounds:CGRectMake(webView.bounds.origin.x, webView.bounds.origin.y, webView.bounds.size.width+20, webView.bounds.size.height)];
    self.webView.hidden = NO;
    [self.tableView setTableFooterView:webView];
    ...
    [webView release];
}

它有效而且速度很快!

【讨论】:

    【解决方案2】:

    当您的 webview 完成加载时,告诉您的 tableview 重新加载它的数据 - 这将再次询问单元格的高度 :)

    - (void)webViewDidFinishLoad:(UIWebView *)webView {
        [webView sizeToFit];
        [tableView reloadData];
    }
    

    第一次加载表格视图时,使用 Web 视图的默认高度并显示加载/请等待消息?

    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
        if (webViewIsLoaded) {
            return [webView bounds[.size.height;
        } else {
            return 50;
        }
    }
    

    【讨论】:

      【解决方案3】:

      你应该在 web 视图完成加载后保存行高,然后刷新表格:

      - (void)webViewDidFinishLoad:(UIWebView *)webView {
          [webView sizeToFit];
          self.rowHeight = webView.bounds.size.height;
          [tableView reloadData];
      }
      

      然后您以这种方式更新tableView:heightForRowAtIndexPath: 方法:

      - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
          return self.rowHeight ? self.rowHeight : 50;
      }
      

      不过,您应该为您的班级定义一个CGFloat rowHeight 属性。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-22
        • 1970-01-01
        • 2017-04-06
        • 2021-12-03
        • 1970-01-01
        相关资源
        最近更新 更多