【知识总结】loadView 方法的思考

问题场景
1,实现标签页
2,子控制器使用UIViewController,添加UITableView实现
3,UIViewController的view在显示的时候添加到scrollerView中,调用viewDidLoad显示处理
4,tableView根据view设置布局(View的frame),View的frame是在容器中设置的(view添加到scrollerView布局)

问题:
tableView的frame计算错误

 在项目中实现下面界面功能是遇到的问题:
      [图片上传中。。。(1)]

这个页面的思路是使用一个viewController作为容器,在viewController中添加scrollerView,作为子视图的容器;
对于内部显示的每个小模块,都是使用一个对应的控制器进行实现,然后将控制器的视图(view)添加到容器的scrollerView中显示
[图片上传中。。。(2)]

1,首先,添加子控制器到父容器中

  • (void)setupChildVc{
    [self addChildController:CKAGMessageBoxMessageTypeTrends title:@"动态"];
    [self addChildController:CKAGMessageBoxMessageTypeCourse title:@"课程"];
    [self addChildController:CKAGMessageBoxMessageTypeDemand title:@"需求"];
    [self addChildController:CKAGMessageBoxMessageTypeMoney title:@"钱包"];
    [self addChildController:CKAGMessageBoxMessageTypeSys title:@"系统"];}- (void)addChildController:(CKAGMessageBoxMessageType)type title:(NSString *)title { CKAGMessageBoxController *trendsBoxVc = [[CKAGMessageBoxController alloc] initWithMessageType:type]; trendsBoxVc.title = title; trendsBoxVc.delegate = self; [self addChildViewController:trendsBoxVc];
    }

2,在需要显示界面的时候,将相应子控制器的view添加到scrollerView中
a,这么做的好处是,界面不需要显示的情况下,不会调用viewDidLoad方法,不会提前加载页面的内容,提高性能

pragma mark - UIScrollViewDelegate- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView{ // 当前索引 NSInteger index = scrollView.contentOffset.x / scrollView.width; // 取出子控制器 CKAGMessageBoxController *vc = self.childViewControllers[index]; vc.view.x = scrollView.contentOffset.x; vc.view.y = 0; // 设置控制器view 的y值为0(默认为20) vc.view.width = scrollView.width;

vc.view.height = scrollView.height; // 设置控制器view 的height值为整个屏幕的高度(默认比屏幕少20)

[scrollView addSubview:vc.view];    [vc requsetNewData];

}

这里的实现是滚动到那个页面,就将哪个页面的view添加到scrollerView上(view添加到scrollerView上之后,重复添加是没有关系的);这个时候如果view没有添加过,就会调用到相应控制器的viewDidLoad方法

原因:
CKAGMessageBoxController *vc = self.childViewControllers[index];
1 vc.view.x = scrollView.contentOffset.x;
vc.view.y = 0; // 设置控制器view 的y值为0(默认为20) vc.view.width = scrollView.width;
2 vc.view.height = scrollView.height; // 设置控制器view 的height值为整个屏幕的高度(默认比屏幕少20)
[scrollView addSubview:vc.view];

代码1的时候,控制器的view实例处理,调用viewDidLoad方法;

  • (void)viewDidLoad {
    [super viewDidLoad];
    // 设置UITableView
    }
    接着,viewDidLoad方法会去实例控制器中tableView,并且设置tableVIew的frame;而tableView的frame是根据self.view的frame设置的

在代码1到代码2才完成了View的frame设置,因此设置tableViewframe的时候view的frame为zero,因此tableView的frame就不是准确的了

活用loadView方法:
翻看之前的项目,之所以之前的项目没有出现问题,是因为用的是UITableViewController,而UITableViewController的view就是tableView,因此tableVIew的frame也就不存在出错的问题。

      和同事讨论loadVIw方法的时候,想到loadVIew方法就是用来实例self.view的,那么上面的情况,我们将使用到的tableView在loadView方法中实现,并且成为self.view不就相当于自己实现了UITableViewController吗?不知道这样是否会出现问题

你可能感兴趣的:(【知识总结】loadView 方法的思考)