我要建一些文本是HTML表,所以我用一个UIWebView作为我的自定义表格单元格的子视图。我已经遇到了一个问题 - 正如我在表中向下滚动,它会采取UIWebViews中的第二个更新。例如,我会在编号为1,2排观看细胞,和3.我向下滚动到说8,图9和10对于一个时刻,UIWebView中的,在小区#8是可见的含量为从小区#1的内容,在小区#9含量,从小区#2,依此类推。

我才知道,问题是UIWebViews中简单地呈现其文本慢。有人建议,只要我能,而不是等待,直到表收到的cellForRowAtIndexPath而不是预加载的内容到一个UIWebView。所以,现在,我有一个域对象,之前刚把的WebView文本内容 - 但现在它实际上有到一个UIWebView本身的引用。

但是,现在一些在UIWebView中的内容的呈现,并且当我在表滚动的UIWebView仅示出为灰色框。如果我接触的灰色框,将实际收到的接触和更新的WebView - 例如,如果我触摸一个链接(这我可能会或可能不会做,因为框是灰色的,这将是由运气中风),到将被要求是有联系的页面和显示正确。

- (id)initWithFrame:(CGRect)frame reuseIdentifier:(NSString *)reuseIdentifier {
if (self = [super initWithFrame:frame reuseIdentifier:reuseIdentifier]) {
            // I suppose this isn't necessary since I am just getting it from the
            // Domain Object anyway
    content = [[UIWebView alloc] initWithFrame:CGRectZero];
    content.backgroundColor = [UIColor blackColor];
    [self addSubview:content];
    [content release];
}
return self;
}

// called by cellForRowAtIndexPath 
- (void)setMyDomainObject:(MyDomainObject*)anObject {
UIWebView *contentWebView = anObject.contentWebView;
int contentIndex = [self.subviews indexOfObject:content];
[self insertSubview:contentWebView atIndex:contentIndex];
}
有帮助吗?

解决方案

要解决这个问题的一种方法是使用几个UILabels,每一个不同的字体。然后策略性把它们在细胞内,使它们看起来像是连续文本。我见过一个UITableView这样做有很好的效果。

另一个性能问题可能是,你是overiding的UITableViewCell和它的init方法。这几乎总是导致一个UITableView表现欠佳。而不是仅仅使用普通的UITableViewCell实例和子视图添加到它的内容查看。

这已由马特加拉格尔的易于定制的UITableView绘图

描述的另一种方法是使用Three20,它可以给你样式的文本,以及

您正试图目前无法用一个UIWebView做什么。

预压不会帮助:当UIWebViews中被渲染的屏幕外这会减慢UI;你要经常采取的iPhone延迟加载。

在一个UITableView把UIWebViews中会与可能不可接受的性能损失。您将需要使用其他手段来实现自己的目标。

不幸的是,NSAttributedString是UIKit中不可用,这很容易解决您的问题。

其他提示

因此,这里是我的更新答案:我实现了使用一个大的UIWebView把表格单元格样式的文本在自己的Twitter客户端应用程序表,的 HelTweetica (与源提供)。它工作得很好,只要你知道如何做布局的HTML和CSS。

您只需要创建一个NSMutableString并添加弥补您的文档HTML的线。你可以参照外部文件,例如在你的应用程序的沙箱CSS文件。您可以设置自定义URL的操作,如“youraction://file.txt”你的Web视图代表可以拦截和处理,更换IBActions:

- (void) refreshWebView {
    TwitterAccount *account = [twitter currentAccount];
    NSMutableString *html = [[NSMutableString alloc] init];
    // Open html and head tags
    [html appendString:@"<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n"];
    [html appendString:@"<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"en\" lang=\"en\">\n"];
    [html appendString:@"<head>\n"];
    [html appendString:@"<meta name='viewport' content='width=device-width' />"];
    [html appendString:@"<link href='style-ipad.css' rel='styleSheet' type='text/css' />"];
    [html appendString:@"<script language='JavaScript' src='functions.js'></script>"];

    // Body
    [html appendString:@"</head><body><div class='artboard'>"];

    // [...]

    // Close artboard div, body. and html tags
    [html appendString:@"</div></body></html>\n"];

    NSURL *baseURL = [NSURL fileURLWithPath: [[NSBundle mainBundle] bundlePath]];
    [self.webView loadHTMLString:html baseURL:baseURL];
    [html release];
}

和可以通过使用JavaScript重新加载该页面的部分:

- (void) refreshTabArea {
    NSString *html = [self stringByEscapingQuotes: [self tabAreaHTML]];
    NSString *js = [NSString stringWithFormat: @"document.getElementById(\"tab_area\").innerHTML = \"%@\";", html];
    [self.webView stringByEvaluatingJavaScriptFromString:js];
}

如果在Web视图中的含量限制在样式文本或超链接,你可能想看看Three20项目:的 http://github.com/joehewitt/three20/tree/master

及其TTStyledText类具有用于在内容<b>, <i>, <img>, and <a>标记的支持。可能比网页视图轻量化。

这是不回答原来的问题问过,但后退了一步,并着眼于大局观,如果你想显示在一个表格单元格中的超链接,是否意味着当你点击它,它会打开一个网页浏览器?难道是相同的,如果你表现出的风格,看起来像或暗示了一个链接表格单元格文本,但打开一个单独的屏幕,全屏Web视图,可以让你的链接点击?

您说:“通过setRowAtIndexPath称为”,您可能意味着“的cellForRowAtIndexPath”,这是所谓的一个UITableView方法当行变为可见,需要创造一个单元格。确保在此方法中,你正确初始化和更新的单元格内容。

你有没有看着重写-prepareForReuse方法上的表格单元格的子类?如果细胞似乎没有当您滚动更新,它可能是可重复使用的单元格的内容没有被清除和复位。

我的理解是,一个web视图不会渲染,除非你发起之后viewDidLoad中(装载)发生。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top