在 UITableViewCell 中,我正在获取旧 UIWebView 的委托回调?
Inside UITableViewCell, I am getting delegate callback of old 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();
}
});
}
嗯,我认为您需要为您的问题提供更多背景信息。我的理解是:UITableView 中有许多单元格(我根据你所说的 "when second cell loads" 假设),每个单元格都有动态高度,具体取决于其 UIWebView 内容。如果是,那么这里是我找到你的代码的一些问题:
- 您正在使用单个全局变量 webViewHeight 到 return 到委托 heightForRowAtIndexPath(这意味着您的所有单元格将具有此高度),这会导致您获得不正确的值。要解决此问题,您可以将这些值缓存在字典中。
- 我看到您每次加载 UIWebView 时都会重新加载 UITableView,因此如果您开始在 cellForRowAtIndexPath 中的某处加载 UIWebView,它可能会导致无限循环。
当我们更新 UIWebView
内容时,我们应该首先将其高度重置为 0 或任何更小的可能值。
否则,如果 webview.height > 实际 contentHeight,它将 return webview.height 而不是 contentsize.height。
我有一个自定义单元格,其中有 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 中有许多单元格(我根据你所说的 "when second cell loads" 假设),每个单元格都有动态高度,具体取决于其 UIWebView 内容。如果是,那么这里是我找到你的代码的一些问题:
- 您正在使用单个全局变量 webViewHeight 到 return 到委托 heightForRowAtIndexPath(这意味着您的所有单元格将具有此高度),这会导致您获得不正确的值。要解决此问题,您可以将这些值缓存在字典中。
- 我看到您每次加载 UIWebView 时都会重新加载 UITableView,因此如果您开始在 cellForRowAtIndexPath 中的某处加载 UIWebView,它可能会导致无限循环。
当我们更新 UIWebView
内容时,我们应该首先将其高度重置为 0 或任何更小的可能值。
否则,如果 webview.height > 实际 contentHeight,它将 return webview.height 而不是 contentsize.height。