• OC-scrollview加载多个控制器界面的优化


    在开发过程中,经常有一个控制器中多个字控制器界面的管理,如下图:

    这种实现方式,很多种,今天主要记录用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);
        }
    }
    

    这样就可以了,这样就会只有滚动到当前界面时,才加载当前控制器视图的数据了。

  • 相关阅读:
    csp 通信网络
    从客户端(content="xxxxx")中检测到有潜在危险的 Request.Form 值——较合理解决方案
    HttpUtility.HtmlEncode 方法
    web程序防止攻击的一些资料——整理
    memcached——学习
    VS2015 无法启动IIS Express Web服务器
    文件上传——资料收集
    水晶报表-需要安装软件
    web安全漏洞相关
    javascript一个在网页上画线的库
  • 原文地址:https://www.cnblogs.com/lyz0925/p/7474527.html
Copyright © 2020-2023  润新知