在开发过程中,经常有一个控制器中多个字控制器界面的管理,如下图:
这种实现方式,很多种,今天主要记录用scrollview实现的方法。并且只加载当前显示界面的数据。
思路:
(1)创建3个需要展示的控制器和1个来展示这3个控制器的控制器
(2)把3个控制器添加在主控制器上
(3)在滚动的时候,判断这个字控制是否已经加载过了,没有的话,就加载,有的话,不做处理
优势:可以避免一次同时加载三个控制器的界面
代码实现如下:
1.创建视图
2.在主控制器中添加3个子控制器
2.1 创建scrollview 并添加3个子控制器,并且调用 scrollViewDidScroll 这个方法,让它默认显示第一个界面
//属性声明 @property (nonatomic, strong) UIScrollView *scrollView; #pragma mark - 添加滚动视图 - (void)addScrollView { self.scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, self.view.bounds.size.height)]; self.scrollView.pagingEnabled = YES; self.scrollView.delegate = self; [self.view addSubview:self.scrollView]; /** * 注意:以前都是先把控制器的view添加到滚动视图中,会出现一个问题,一进来要加载的数据太多 * 因此,加载的时候,只加载控制器,不加载控制器的视图,等到需要用到的时候,再viewdidload即可 */ FirstViewController *firstV = [[FirstViewController alloc] init]; [self addChildViewController:firstV]; TwoViewController *twoV = [[TwoViewController alloc] init]; [self addChildViewController:twoV]; ThreeViewController *threeV = [[ThreeViewController alloc] init]; [self addChildViewController:threeV]; self.scrollView.contentSize = CGSizeMake(self.view.bounds.size.width * 3, self.view.bounds.size.height); [self scrollViewDidScroll:self.scrollView]; } 在viewdidload中调用 //添加滚动视图 [self addScrollView];
2.2 scrollViewDidScroll 这个方法的实现(这个方法是scrollview的代理),滚动时,判断一下 下个视图是否加载过了,如果没有加载过,就把加载视图到scorllview上
- (void)scrollViewDidScroll:(UIScrollView *)scrollView { self.offIndex = (scrollView.contentOffset.x + self.view.bounds.size.width * 0.5) / self.view.bounds.size.width ; //获取contentOffset CGPoint currentOffset = scrollView.contentOffset; NSInteger page = currentOffset.x / self.view.bounds.size.width; //取出对应控制器 UIViewController *viewController = self.childViewControllers[page]; //添加到scrollView容器 if (![viewController isViewLoaded]) { [self.scrollView addSubview:viewController.view]; viewController.view.frame = CGRectMake(page * self.view.bounds.size.width, 0,self.view.bounds.size.width, self.view.bounds.size.height); } }
这样就可以了,这样就会只有滚动到当前界面时,才加载当前控制器视图的数据了。