Garder des WebView en mémoire au changement de View
Bonjour,
comme je l'avais expliqué sur l'un de mes anciens postes j'essaye de créer une application avec une WebView par View (et je change de View en élidant celle-ci).
Seulement à chaque fois que je change de View je suis obligé de recharger ma webview ...
Sous Android c'est ".setOffscreenPageLimit()" avec en argument le nombre de page que je souhaite garder en mémoire. Est ce qu'il y'a un équivalent chez Apple ?
J'ai déjà tenté de remplacer :
@property (weak, nonatomic) IBOutlet UIWebView *webContact;
@property (weak, nonatomic) IBOutlet UIWebView *webEven;
@property (weak, nonatomic) IBOutlet UIWebView *webBus;
par
@property (strong, retain) IBOutlet UIWebView *webContact;
@property (strong, retain) IBOutlet UIWebView *webEven;
@property (strong, retain) IBOutlet UIWebView *webBus;
Mais rien ne change.
J'ai un peu de mal avec ce langage alors un peu d'aide est toujours la bienvenu !
Merci.
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Salut,
setOffscreenPageLimit() est une propertie du composant ViewPager. Ce qu'il faut chercher c'est l'équivalent du ViewPage == UIPageViewController.
Sous iOS, le UIPageViewController utilise plutôt le pattern delegate/data source pour demander la page suivante et la page précédente.
https://developer.apple.com/library/ios/documentation/uikit/reference/UIPageViewControllerClassReferenceClassRef/UIPageViewControllerClassReference.html
https://developer.apple.com/library/ios/documentation/uikit/reference/UIPageViewControllerDataSourceProtocolRef/UIPageViewControllerDataSource.html#//apple_ref/occ/intf/UIPageViewControllerDataSource
J'espère que ça répond à ta question.
Salut,
Et bien j'étais sur la bonne voie (ViewPager == UIPageViewController), j'étais même tombé sur la Doc d'Apple comme les liens que tu m'a donné.
Mais même avec cette doc je n'arrive pas à trouver la solution à mon problème
Tu me parles des pattern delegate / data source et c'est certainement de ce coté qu'il faut regarder, mais je n'y connais rien à ce niveau ?
En tous cas, sauf erreur de ma part, il n'existe aucune méthode à appliquer à notre UIPageViewController pour lui demander combien de View mettre en mémoire ..
Merci d'avoir pris le temps de répondre
J'ai continué à chercher, mais sans résultat, personne n'a d'autre piste ? Ou quelqu'un peut m'aiguiller d'avantage sur la piste en cours ?
En vous remerciant
Salut,
Oui tu es sur la bonne piste, UIUPageViewController. C'est lui qui va géré le nombre de contrôleurs/vues en mémoires. A chaque fois qu'il veux afficher une nouvelle vue, il demande à sa source de donnée (un objet qui se conforme au protocol UIPageViewControllerDataSource) le prochain contrôleurs et le précédent.
Y a plein de tutorials sur internet si tu n'arrives pas à le mettre en oeuvre toi même.
http://www.techotopia.com/index.php/An_Example_iOS_5_iPhone_UIPageViewController_Application
Merci pour ta réponse, mais le tuto que tu m'as donné sert à mettre en oeuvre une application multipage à l'aide d'un PageViewController ? Mais je l'ai déjà fait ^^
Mais du coup je ne n'arrive toujours pas à mettre un vue en mémoire (puisque j'avais regardé la doc sur UIPageViewController)
Merci quand même ... (à moins que j'ai loupé quelques chose dans ta réponse)
Je ne comprends pas ce que tu veux dire par mettre une vue en mémoire ?
Tu peux monter ton code stp et dire ce qui ne marche pas ou bien expliquer ce que tu veux avoir comme visuel ( chargé une webView,...)
Et bien en fait j'ai mon application multi page qui fonctionne, en les appelant les vues de cette façon :
Le problème c'est qu'à chaque fois que je change de vue (en glissant un écran donc) je suis obligé de la recharger ... et je voudrai qu'une fois qu'une vue est chargée totalement, la garder en "mémoire" afin de ne plus avoir besoin de la recharger par la suite, et ainsi rendre la navigation plus fluide ...
Est-ce plus clair ?
Merci
1) Solution 1, tu crées une propriété de type PageContentViewController pour chaque page. Dans chacun de tes "if", au lieu de faire un "instantiaiteViewControllerWithIdentifier:" systématiquement et donc de réallouer une nouvelle instance à chaque fois, tu regardes si la @property correspondante est nil. Si elle est nil tu instancies le ViewController et le garde de côté dans la @property... mais si elle n'est pas nil et que tu as déjà le PageContentViewController pour cette page, bah tu le réaffiches
2) Solution 2 : même principe mais au lieu d'avoir une @property par page, tu mets tout ça dans un NSArray
3) Solution 3, la plus propre, tu utilises un objet NSCache (qui fonctionne un peu comme un NSDictionary, mais est justement fait pour gérer les aspects cache (= si jamais tu as un Memory Warning il va se vider pour libérer de la mémoire, etc, etc)
Salut, toutes tes réponses sembles répondre à mon problème ... En copiant (bêtement) je l'avoue ton bout de code, puisque je n'y connais pas grand chose) je me retrouve avec pas mal d'erreur; alors je vais essayer ta solution 1, dommage la 3 était plus propre !
Les screens des erreurs sont en pièces jointes
Merci
La solution n°1 fonctionne alors merci !
Je répond sur un nouveau post pour que ce soit plus clair, voici donc le code si ça peut en aider d'autre :
Oui oui je me doute bien, j'ai fais quelques adaptations et j'ai compris l'idée général !
Seulement ne connaissant pas du tout ce langage j'ai un peu de mal avec les erreurs entre les types de variables (NSString et NSUInteger par exemple), l'erreur sur @contact et pas les autres pour nibNames et également à propos de la fonction - (id)init qui me sort une erreur que je connais pas non plus.
Je pense rester sur la solution 1 du coup puisqu'elle me semble assez efficace, mais dommage pour la solution 3 qui été intéressante !
Enfin bref en te remerçiant
Oui ça doit surement être ça !
Je me doute que ce sont des erreurs d'inattention seulement je ne connais pas du tout ce langage alors après la moindre erreur devient vite un calvaire x)
Mais grâce à toi je connais à présent le NSCache qui est très intéressant
En te remerciant ! Je regarder ça en détail dans la semaine