Совместное использование UIView между UIViewControllers в UITabBarController - PullRequest
2 голосов
/ 18 марта 2010

У меня есть UIScrollView, в котором находится галерея изображений, которые пользователь может прокручивать. Это представление должно быть видно на каждом из трех отдельных UIViewController, которые размещены в UITabBarController. Прямо сейчас у меня есть три отдельных экземпляра UIScrollView в подклассе 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 Ответ

1 голос
/ 18 марта 2010

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

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

и звоните:

[firstView setGallery:singleScrollerForAll];

или

[secondView setGallery:singleScrollerForAll];

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...