2010-03-18 3 views
2

У меня есть UIScrollView, в котором находится галерея изображений, которую пользователь может прокрутить. Это представление должно быть видимым на каждом из трех отдельных UIViewControllers, которые размещаются внутри UITabBarController. Прямо сейчас у меня есть три отдельных экземпляра UIScrollView в подклассе UITabBarController, и контроллер управляет тем, что три синхронизированы (когда пользователь прокручивает тот, который они видят, программно прокручивая два других, чтобы они совпадали, и т. Д.), Что не идеально.Обмен UIView между UIViewControllers в UITabBarController

Я хотел бы знать, есть ли способ работать только с одним экземпляром UIScrollView, но он отображается только в UIViewController, с которым пользователь взаимодействует. Это полностью устранит весь код синхронизации. Вот в основном то, что я сейчас в UITabBarController (что, где все это в настоящее время управляет):

@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 

UITabBarController получает уведомление (как делегата зрения скроллинга), когда пользователь прокручивает один из экземпляров, а затем вызывает методы, такие как scrollToMatch:, чтобы синхронизировать другие два с выбором пользователя.

Есть ли что-то, что можно сделать, используя отношения «много-к-одному» на IBOutlet или что-то в этом роде, чтобы сузить это до одного экземпляра, чтобы мне не пришлось управлять тремя списками прокрутки? Я попытался сохранить один экземпляр и переместить указатель с одного взгляда на следующий, используя методы UITabBarControllerDelegate (вызывающий setGallery:nil на текущем и setGallery:scrollerOne на каждый раз при каждом изменении), но скроллер никогда не перемещался на другие вкладки.

Заранее благодарен!

ответ

1

Конечно, вы должны использовать только один экземпляр вида скроллера. И это будет нормально работать без каких-либо проблем. Используйте метод setGallery: как вы делали, просто убедитесь, что вы добавить свой вид singleScrollerForAll с учетом текущего контроллера в методе setGallery:

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

и называют:

[firstView setGallery:singleScrollerForAll]; 

или

[secondView setGallery:singleScrollerForAll]; 

и не нужно ничего делать в других двух контроллерах, потому что при вызове addSubview: subView будет автоматически удален из предыдущего супервизора.

+0

Vladimir - Большое спасибо за понимание. Это работает отлично. Ваше утверждение заставило меня изучить его более глубоко, чтобы обнаружить, что моя реализация была ошибочной в назначении каждого UIScrollView как IBOutlet. Несмотря на то, что я пытался перемещать указатели, с подключением IBOutlet все еще на месте, это было бесполезно. Как только я получил это из головы и использовал addSubView, жизнь была хорошей. – Devunwired

Смежные вопросы