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!
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