2010-03-18 5 views
2

J'ai un UIScrollView qui contient une galerie d'images que l'utilisateur peut faire défiler. Cette vue doit être visible sur chacun des trois UIViewControllers séparés qui sont hébergés dans un UITabBarController. À l'heure actuelle, j'ai trois instances distinctes UIScrollView dans la sous-classe UITabBarController, et le contrôleur gère en gardant les trois synchronisés (quand un utilisateur fait défiler celui qu'il peut voir, en faisant défiler les deux autres par match, etc.), ce qui n'est pas idéal.Partage d'un UIView entre les UIViewControllers dans un UITabBarController

Je voudrais savoir s'il est possible de travailler avec une seule instance de UIScrollView, mais qu'elle n'apparaisse que dans le UIViewController avec lequel l'utilisateur est en train d'interagir. Cela éliminerait complètement tout le code de synchronisation. Voici essentiellement ce que j'ai maintenant dans le UITabBarController (qui est l'endroit où tout cela est actuellement géré):

@interface ScrollerTabBarController : UITabBarController { 
    FirstViewController *firstView; 
    SecondViewController *secondView; 
    ThirdViewController *thirdView; 

    UIScrollView *scrollerOne; 
    UIScrollView *scrollerTwo; 
    UIScrollView *scrollerThree; 
} 
@property (nonatomic,retain) IBOutlet FirstViewController *firstView; 
@property (nonatomic,retain) IBOutlet SecondViewController *secondView; 
@property (nonatomic,retain) IBOutlet ThirdViewController *thirdView; 
@property (nonatomic,retain) IBOutlet UIScrollView *scrollerOne; 
@property (nonatomic,retain) IBOutlet UIScrollView *scrollerTwo; 
@property (nonatomic,retain) IBOutlet UIScrollView *scrollerThree; 

@end 

@implementation ScrollerTabBarController 

- (void)layoutScroller:(UIScrollView *)scroller {} 
- (void)scrollToMatch:(UIScrollView *)scroller {} 

- (void)viewDidLoad { 
    [self layoutScroller:scrollerOne]; 
    [self layoutScroller:scrollerTwo]; 
    [self layoutScroller:scrollerThree]; 

    [scrollerOne setDelegate:self]; 
    [scrollerTwo setDelegate:self]; 
    [scrollerThree setDelegate:self]; 

    [firstView setGallery:scrollerOne]; 
    [secondView setGallery:scrollerTwo]; 
    [thirdView setGallery:scrollerThree]; 
} 

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView { 
    [self scrollToMatch:scrollView]; 
} 

@end 

Le UITabBarController est notifié (en tant que délégué de la vue de défilement) lorsque l'utilisateur fait défiler une des instances, puis appelle des méthodes comme scrollToMatch: pour synchroniser les deux autres avec le choix de l'utilisateur.

Y at-il quelque chose qui peut être fait, en utilisant une relation many-to-one sur IBOutlet ou quelque chose comme ça, pour réduire cela à une instance afin de ne pas avoir à gérer trois vues de défilement? J'ai essayé de conserver une seule instance et de déplacer le pointeur d'une vue à l'autre en utilisant les méthodes UITabBarControllerDelegate (en appelant setGallery:nil sur le courant et setGallery:scrollerOne sur le suivant chaque fois qu'il changeait), mais le scroller ne s'est jamais déplacé vers les autres onglets.

Merci d'avance!

Répondre

1

Certainement, vous devriez utiliser une seule instance de votre vue scroller. Et cela fonctionnera bien sans aucun problème. Utiliser la méthode setGallery: comme vous l'avez fait, juste vous assurer que vous ajoutez votre vue singleScrollerForAll à la vue du régulateur de courant dans la méthode de setGallery:

-(void)setGallery:(UIView *)aScrollerView{ 
    [self.view addSubview:aScrollerView]; 
} 

et appelez:

[firstView setGallery:singleScrollerForAll]; 

ou

[secondView setGallery:singleScrollerForAll]; 

et inutile de faire quoi que ce soit dans les deux autres contrôleurs, car lorsque vous appelez addSubview: la sous-vue sera automatiquement supprimée de la vue précédente.

+0

Vladimir - Merci beaucoup pour les idées. Cela fonctionne parfaitement. Votre affirmation m'a amené à regarder plus en profondeur pour découvrir que mon implémentation était défectueuse dans l'attribution de chaque UIScrollView en tant qu'IBOutlet. Même si j'ai essayé de déplacer les pointeurs, avec les connexions IBOutlet toujours en place, c'était futile. Une fois que j'ai compris cela et utilisé addSubView, la vie était belle. – Devunwired

Questions connexes