Frage

Ich baue eine Tabelle mit etwas Text, HTML, so dass ich eine UIWebView als Subview meiner benutzerdefinierten Tabellenzellen. Ich lief schon in ein Problem - wie ich in der Tabelle nach unten gescrollt, würde es die UIWebViews eine Sekunde zu aktualisieren nehmen. Zum Beispiel würde ich 1, 2 nummerierte sehen Zellen in den Zeilen sein, und 3. würde ich nach unten scrollen 8 zu sagen, 9 und 10. Für einen Moment wird der Inhalt des UIWebView, die sichtbar in Zelle # 8 war war der Inhalt von Zelle # 1 war der Gehalt in Zelle # 9, dass von der Zelle # 2, und so weiter.

erfuhr ich, dass das Problem war, dass UIWebViews einfach ihren Text langsam machen. Es wurde vorgeschlagen, stattdessen den Inhalt in die UIWebView Vorspannung so schnell wie ich konnte, anstatt zu warten, bis die Tabelle die cellForRowAtIndexPath erhält. So, jetzt habe ich ein Domain-Objekt, das vor nur den Textinhalt der WebView hatte - aber jetzt hat es tatsächlich einen Verweis auf den UIWebView selbst.

Aber jetzt einige der Inhalte in der UIWebView macht, und wenn ich durch den Tisch blättern die UIWebView zeigt nur als graues Feld. Wenn ich das graue Feld berühren, wird es tatsächlich die Note erhalten und die WebView aktualisieren - zum Beispiel, wenn ich einen Link berühren (was ich kann oder nicht tun, da die Box ist grau und es würde durch einen glücklichen Zufall sein), die Seite, die ordnungsgemäß angefordert und angezeigt wurde verknüpft.

- (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];
}
War es hilfreich?

Lösung

Eine Möglichkeit, dies zu umgehen wäre mehrere UILabels zu verwenden, die jeweils mit verschiedenen Schriftarten. Dann strategisch sie innerhalb der Zelle platzieren, wie sie wie zusammenhängender Text zu machen scheinen. Ich habe dies in einem UITableView mit sehr guten Ergebnissen durchgeführt gesehen.

Ein weiteres Performance-Problem kann sein, dass Sie UITableViewCell sind overiding und es ist init-Methode. Dies führt fast immer zu einem schlechten Leistung in einem UITableView. Stattdessen verwenden Sie einfach die regulären UITableViewCell Instanzen und fügen Subviews es content ist.

Dies wurde ausführlich von Matt Gallagher einfacher kundenspezifische UITableView Zeichnung bedeckt .

Eine andere Methode beschrieben wurde Three20 zu verwenden, die Sie Text und Stil geben kann.

Was Sie gerade versuchen, nicht mit UIWebview erfolgen.

Vorbelastung wird nicht helfen: dies die Benutzeroberfläche verlangsamen würde, wenn UIWebviews offscreen gemacht werden; Sie sollten immer ein träges Laden auf dem iPhone üben.

Putting UIWebviews in einem UITableView wird mit einer potenziell unannehmbaren Leistungseinbußen kommen. Sie müssen andere Mittel verwenden, um Ihr Ziel zu erreichen.

Leider ist NSAttributedString nicht verfügbar in UIKit, die Ihr Problem leicht lösen könnte.

Andere Tipps

Also hier ist meine Antwort aktualisiert: Ich habe implementiert eine Tabelle ein großes UIWebView mit setzen formatierten Text in Tabellenzellen in meiner eigenen Twitter-Client-Anwendung, HelTweetica (mit Quelle zur Verfügung). Es funktioniert ziemlich gut, solange Sie verstehen, wie das Layout in HTML und CSS zu tun.

Sie erstellen Sie einfach eine NSMutableString und fügen Sie die HTML-Zeilen, die das Dokument bilden. Sie können Referenzen externe Dateien wie CSS-Dateien, die in Ihrer App Sandbox sind. „: //File.txt youraction“, die Ihre Web-Ansicht delegieren abfangen und verarbeiten kann als Ersatz IBActions: Sie können benutzerdefinierte URL-Aktionen wie Set

- (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];
}

Und Sie können mit Javascript, Teile der Seite neu zu laden:

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

Wenn der Inhalt in der Web-Ansicht zu formatierten Text oder Hyperlinks beschränken Sie vielleicht einen Blick auf dem Three20 Projekt teilnehmen wollen: http://github.com/joehewitt/three20/tree/master

Die TTStyledText Klasse hat die Unterstützung für <b>, <i>, <img>, and <a> Tags im Inhalt. Wahrscheinlich leichter als WebViews.

Dies ist die ursprüngliche Frage gebeten, nicht zu antworten, aber das Gesamtbild einen Schritt zurück und schaut nehmen, wenn Sie einen Hyperlink in einer Tabellenzelle angezeigt sind versucht, bedeutet, dass, wenn Sie darauf klicken, um es öffnet sich ein Webbrowser? Wäre es das gleiche sein, wenn Sie Text in der Tabellenzelle Stil zeigte, dass gleiche oder Hinweise auf einen Link aussieht, aber öffnen Sie einen separaten Bildschirm mit einer Vollbild-Web-Ansicht, die Sie auf den Link tippen können?

Du hast gesagt, ‚durch setRowAtIndexPath namens‘, könnte man ‚cellForRowAtIndexPath‘ verstanden, die eine UITableView-Methode aufgerufen wird, wenn eine Zeile sichtbar wird und muss eine Zelle erstellen. Stellen Sie sicher, dass bei diesem Verfahren Sie richtig initialisiert wird und die Aktualisierung der Zelleninhalte.

Haben Sie sich die -prepareForReuse Methode auf Tabellenzelle Unterklasse in Überschreiben? Wenn die Zellen scheinen nicht zu aktualisieren, wenn Sie blättern, ist es möglich, dass der Inhalt von wieder verwendbaren Zellen nicht gelöscht werden und zurückgesetzt werden.

Mein Verständnis ist, dass ein WebView nicht machen, wenn Sie das Laden von ihm NACH viewDidLoad () geschieht einzuleiten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top