Comment utiliser un UIWebView dans une cellule de tableau?
Je suis en train de construire un tableau avec du texte qui est en HTML, donc je suis en utilisant une UIWebView comme une sous-vue de ma coutume cellules d'un tableau. J'ai déjà couru dans un problème - comme je défile vers le bas dans le tableau, ce serait prendre le UIWebViews une seconde pour mise à jour. Par exemple, je serais la visualisation de Cellules à des lignes numérotées 1, 2, et 3. J'avais faites défiler vers le bas-à-dire 8, 9, et 10. Pour un moment, le contenu de la UIWebView qui était visible dans la cellule n ° 8 a été le contenu de la cellule #1, le contenu dans la cellule n ° 9 a été qu'à partir de la cellule n ° 2, et ainsi de suite.
J'ai appris que le problème était que UIWebViews simplement rendre leur texte lentement. Il a été suggéré à la place de la précharge du contenu dans la UIWebView dès que j'ai pu, au lieu d'attendre jusqu'à ce que la table reçoit le cellForRowAtIndexPath. Alors maintenant, j'ai un Objet de Domaine qui eu juste le contenu du texte de la WebView - mais maintenant, elle a en fait une référence à la UIWebView lui-même.
Mais maintenant partie du contenu de la UIWebView rend, et quand j'ai faites défiler la table de la UIWebView montre seulement comme une zone grise. Si je touche la zone grise, il va recevoir le toucher et la mise à jour de la WebView - par exemple, si je touche un lien (que je peut ou ne peut pas faire, car la case est grise et qu'il le serait par un coup de chance), la page qui a été lié à sera demandé et les affiche correctement.
- (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];
}
source d'informationauteur bpapa | 2009-03-14
Vous devez vous connecter pour publier un commentaire.
Un moyen de régler ce problème serait d'utiliser plusieurs UILabels, chacun avec différentes polices de caractères. Puis les placer stratégiquement à l'intérieur de la cellule pour les faire paraître comme contigus texte. J'ai vu cette façon de faire dans un UITableView avec de très bons résultats.
Un autre problème de performances peut être que vous êtes overiding UItableViewCell et de la méthode init. Cela conduit presque toujours à une mauvaise performance dans un UITableView. Au lieu d'utiliser seulement la régulière UITableViewCell instances et ajouter des sous-vues à la contentView.
Cela a été largement couverte par Matt Gallagher Facile Personnalisé UITableView Dessin.
Une autre méthode décrite a été d'utiliser Three20, qui peut vous donner style de texte.
Ce que vous tentez actuellement ne peut être fait avec UIWebview.
Préchargement n'aide pas: ce serait de ralentir l'INTERFACE utilisateur lorsque UIWebviews sont rendues à l'écran; vous devriez toujours pratiquer le chargement paresseux sur l'iPhone.
Mettre UIWebviews dans un UITableView viendra avec une potentiellement inacceptables des performances. Vous aurez besoin d'utiliser d'autres moyens d'atteindre votre objectif.
Malheureusement, NSAttributedString n'est pas disponible dans UIKit, ce qui peut facilement résoudre votre problème.
Voici donc ma mise à jour de réponse: j'ai mis en place une table à l'aide d'un gros UIWebView de mettre de style de texte à l'intérieur des cellules de tableau dans mon propre client Twitter app, HelTweetica (avec le code source disponible). Il fonctionne très bien aussi longtemps que vous comprenez comment faire de la mise en page en HTML et CSS.
Vous suffit de créer un
NSMutableString
et ajoutez les lignes de code HTML de votre document. Vous pouvez références de fichiers externes tels que les fichiers CSS sont dans votre application sandbox. Vous pouvez définir l'URL personnalisée des actions telles que "youraction://file.txt" que votre vue web délégué peut intercepter et traiter comme un remplacementIBAction
s:Et vous pouvez recharger les parties de la page à l'aide de javascript:
Si le contenu de la vue web est limité aux style du texte ou des liens hypertextes vous voudrez peut-être jeter un oeil à la Three20 projet: http://github.com/joehewitt/three20/tree/master
Son
TTStyledText
classe a un support pour<b>, <i>, <img>, and <a>
balises dans le contenu. Probablement plus léger que webviews.Ce n'est pas de répondre à la question initiale posée, mais en prenant un peu de recul et de regarder l'image plus grande, si vous essayez d'afficher un lien hypertexte dans une cellule de tableau, cela signifie quand vous cliquez dessus il ouvre un navigateur web? Serait-il le même si vous avez montré de style de texte dans la cellule du tableau qui ressemble ou allusion à un lien, mais de s'ouvrir à un écran avec un affichage plein écran à l'affichage web qui vous permet d'appuyer sur le lien?
Vous avez dit "appelé par setRowAtIndexPath", vous pourriez dire "cellForRowAtIndexPath" qui est une UITableView méthode appelée lorsqu'une ligne est visible et a besoin de créer une cellule. Assurez-vous que dans cette méthode, vous êtes bien l'initialisation et la mise à jour du contenu de la cellule.
Avez-vous regardé dans la substitution de l'-prepareForReuse méthode sur votre table de cellules de la sous-classe? Si les cellules ne semblent pas à jour lorsque vous faites défiler, il est possible que le contenu de réutilisables cellules n'est pas en cours d'effacement et de réinitialisation.
Ma compréhension est qu'une WebView ne sont pas rendues, sauf si vous lancer le chargement de celle-ci APRÈS viewDidLoad() se produit.