2009-11-27 3 views
1

J'ai une application avec une vue de table à la racine dans un contrôleur de navigation, et sur la sélection d'une cellule de tableau, elle affiche un nouveau contrôleur de vue qui contient seulement un UIWebView (avec une barre d'outils et une barre de navigation).scrollsToTop ne fonctionne pas lorsque UIWebView est utilisé avec pushViewController, recherche de solution

En fonction de la présentation de la nouvelle vue Web, la fonctionnalité permettant à l'utilisateur de cliquer sur la barre d'état en haut et de faire défiler la vue Web vers le haut fonctionne ou ne fonctionne pas.

Si j'utilise:

  • (void) presentModalViewController: (UIViewController *) modalViewController animé: (BOOL) animé

sur le RootView, le WebView ne défile vers le haut.

Si je change qu'une ligne de code et à la place utiliser:

  • (void) pushViewController: (UIViewController *) viewController animé: (BOOL) animé

sur le contrôleur de navigation, puis la fonction scrollsToTop cesse de fonctionner. Mais ce que je veux vraiment utiliser, pour d'autres raisons dans le contexte de l'application, c'est la méthode pushViewController. MAIS, je veux aussi garder le comportement scrollsToTop.

J'ai jusqu'à présent essayé différentes approches, certains ont décrit ici:

-Attempting pour régler la ScrollView interne WebView scrollsToTop propriété

((UIScrollView *)[[webView valueForKey:@"_internal"] valueForKey:@"scroller"]).scrollsToTop = YES; 

(Aucun effet perceptible). -Changement de l'ordre de définition des propriétés NavBar ou de ne pas en définir du tout -Ajout d'appels supplémentaires "makeKeyAndOrderFront" à la fenêtre après le nouvel affichage.

Je ne crois pas qu'il existe d'autres vues qui pourraient prétendre à la propriété "scrollsToTop" (et le premier test ci-dessus le prouve dans tous les cas). À moins d'essayer d'intégrer UIWebView dans un UIScrollView, ce qui, à mon avis, sera douloureux, je n'ai plus d'itinéraires à explorer pour résoudre ce problème.

J'espère que quelqu'un d'autre a trouvé un moyen de corriger cela?

Répondre

0

Il s'est avéré que cela ne fonctionnait pas à cause de la façon dont je personnalisais la barre de navigation. Je remplaçais leftBarButtonItem avec un UIBarButtonItem qui occupait toute la barre de navigation (je pense que j'ai pris cette approche à partir du code Apple il y a plusieurs mois, mais je ne suis pas sûr). J'utilisais la même approche sur une autre vue et le scrollsToTop fonctionnait bien là.

En supprimant ce code et en mettant la vue Navbar personnalisée dans (par exemple) self.navigationController.titleView a résolu ce problème. Je ne sais pas vraiment pourquoi, comme je dis que cela fonctionne bien pour d'autres points de vue.

J'ai perdu beaucoup de temps avec ce problème, donc j'espère que je sauve quelqu'un d'autre des cheveux en décrivant ici :)

1

Essayez l'approche inverse comme une solution de contournement.

Dans le contrôleur de vue racine:

- (void)viewWillDisappear:(BOOL)animated { 
    [super viewWillDisappear:animated]; 
    self.tableView.scrollsToTop = NO; 
} 

- (void)viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:animated]; 
    self.tableView.scrollsToTop = YES; 
} 

Bye!

+0

Merci pour la réponse muccy! Je vois où vous allez là-bas, peut-être la vue racine avec sa table revendique le scrollsToTop! Avec de grands espoirs j'ai essayé ceci, mais malheureusement aucun effet! :-( Merci beaucoup pour l'idée, et si vous en avez d'autres, n'hésitez pas à les jeter :) – theLastNightTrain

+0

C'est vraiment étrange. Dans une application que je développe j'ai le même scénario (contrôleur de vue de table -> vue web [contrôleur]) et je n'ai aucun problème avec le comportement de la barre d'état ... Si je vais avoir une idée j'ai gagné Hésitez pas à vous suggérer! :) – muccy