在UITabBarController中的UIViewControllers之间共享UIView

时间:2010-03-18 13:45:23

标签: iphone uitabbarcontroller

我有一个UIScrollView,其中包含用户可以滚动浏览的图像库。此视图需要在位于UITabBarController中的三个单独的UIViewController中的每一个上可见。现在,我在UITabBarController子类中有三个单独的UIScrollView实例,并且控制器管理保持三个同步(当用户滚动他们可以看到的那个,以编程方式滚动其他两个以匹配等),这是不理想的。

我想知道是否有一种方法只能使用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 个答案:

答案 0 :(得分:1)

当然,您应该只使用滚动条视图的一个实例。它会正常工作没有任何麻烦。使用方法setGallery:就像你一样,只需确保在setGallery方法中添加singleScrollerForAll视图以查看当前控制器:

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

并致电:

[firstView setGallery:singleScrollerForAll];

[secondView setGallery:singleScrollerForAll];

并且无需在其他两个控制器中执行任何操作,因为当您调用addSubview时:subView将自动从之前的superview中删除。