2010-11-22 22 views
2

J'ai un mauvais cas de paralysie d'analyse sur celui-ci alors je pensais que je l'ouvrirais à SO:Question de conception iOS: comment la commutation entre les jours doit-elle être implémentée dans une vue de table?

J'ai une vue de table, dont le contenu représente des activités qui ont eu lieu un jour donné . Lorsque l'application se charge, les données d'aujourd'hui sont téléchargées, analysées (à la fois par un singleton central) et affichées. Assez simple, et cela fonctionne très bien.

Je voudrais ajouter la possibilité d'aller de l'avant/arrière entre les jours, en utilisant un certain type de contrôle au sommet. Un excellent exemple serait l'affichage du jour de l'application Calendrier iOS. Ou, alternativement, je pourrais init et pousser de nouvelles vues en utilisant une barre de navigation et navigationItem.rightBarButtonItem & navigationItem.leftBarButtonItem. Quelle est la meilleure approche ici, et comment devrait-elle être mise en œuvre (par exemple, utiliser une autre vue intermédiaire ou gérer tout à partir de la vue de table qui affiche réellement les données)?

Répondre

4

J'ai implémenté quelque chose de presque identique dans une application que je développe pour un client en ce moment.

Tout d'abord j'exposer une méthode sur votre contrôleur de vue de la table où vous pouvez régler le jour pour afficher les données pour:

- (void)setDayToDisplayDataFor:(NSDate *)date animated:(BOOL)animated; 

J'y ai choisi NSDate et vous pouvez par exemple présentent des données pour les 24 heures à partir de cette date. Ou vous pouvez choisir une autre méthode, celle qui vous convient le mieux et votre modèle de données. Une alternative pourrait être un entier représentant le nombre de jours en arrière à regarder.

Je développerais ensuite un contrôle personnalisé (une sous-classe de UIView) avec deux boutons fléchés gauche/droite à chaque extrémité et la date au milieu. Vous pouvez soit coller cela dans l'en-tête de la vue de la table afin qu'il défile de l'écran ou l'avoir au-dessus de la vue de la table entièrement de sorte qu'il reste là lors du défilement. Quelque chose comme ceci:

alt text

Lorsque l'utilisateur tape un bouton pour aller vers l'avant/arrière, vous pouvez faire glisser l'étiquette de date vers la gauche ou à droite et faites glisser la nouvelle date qui donne une indication visuelle. que s'est-il passé.

Le contrôle doit également appeler un délégué pour l'informer du changement de date. Dans ce cas, le délégué est juste votre contrôleur de vue de table. Ainsi, lorsque l'utilisateur appuie sur le bouton, vous saisissez la nouvelle date du contrôle de date personnalisé et appelez votre méthode setDayToDisplayDataFor:animated: pour afficher les données mises à jour. Vous pouvez également animer ce changement de vue de table si vous le souhaitez.

+0

+1 pour une vue au-dessus (ou en dehors de) de votre vue de table. Nous le faisons tout le temps pour donner à l'utilisateur la possibilité de manipuler la tableview de manière significative.touchUpInside sur l'un des boutons force un changement de modèle de données et un reloadData sur la tableview. – par

+0

Parfait. Fonctionne comme un charme. –

0

Je pense que la réponse de Mike est bonne. J'irais encore plus loin pour dire que votre vue de contrôleur de vue pourrait héberger deux UITableViews séparés (ils peuvent tous les deux employer votre contrôleur de vue en tant que délégué ...). La raison pour cela serait d'améliorer votre capacité à faire la transition entre les deux vues séparées sur un changement de jour.

Votre hiérarchie de vue peut-être:

YourCustomViewController <UITableViewDelegate, UTableViewDataSource, CustomDatePickerDelegate> 
    view 
     date-picker-control-view 
     tableview1 
     tableview2 

Avec cet arrangement, vous pouvez utiliser des animations vue transition intégrée pour basculer entre tableview1 et tableview2.

+0

Je voudrais prendre un instantané de la vue et l'aplanir, avoir deux vues de table va être assez lourd. Il y a beaucoup de code disponible pour prendre un instantané d'une vue dans un UIImage. Ensuite, vous effectuez une transition in/out en utilisant un UIImageView du tableau précédent. –

+0

Je ne suis pas d'accord qu'avoir deux vues de table serait fastidieux sur le plan des ressources. – TomSwift

+1

Je ne suis pas d'accord que d'avoir deux vues de table serait fastidieux sur le plan des ressources. Probablement moins cher que de générer un bitmap, de stocker ce bitmap et de l'afficher à chaque transition. Le bitmap lui-même serait d'environ 2,4 Mo pour un affichage rétine. – TomSwift