
问题描述:
我在UICollectionViewController中添加子控制器数组, 并在cellForItem中把子控制器数组中对应的控制器对应的view添加到了UICollectionViewControllerCell的contentView中去了, 但是在运行的时候, 发现首个子控制器的viewWillAppear方法不调用.
原因: 通过addsubview的方法会延时加载, viewWillAppear方法会被跳过.
解决方案:
// 在viewDidLoad方法中addChildViewController:
- (void)viewDidLoad {
[super viewDidLoad];
// 添加子控制器
[self setupAllChildViewController];
}
#pragma mark - 添加所有的子控制器
- (void)setupAllChildViewController
{
// 每日任务
DayJobWebController *dayJobVC = [[DayJobWebController alloc] init];
[self addChildViewController:dayJobVC];
[dayJobVC beginAppearanceTransition:YES animated:YES];
// 基本任务
BaseJobWebController *baseJobVC = [[BaseJobWebController alloc] init];
[self addChildViewController:baseJobVC];
[dayJobVC beginAppearanceTransition:YES animated:YES];
}
注: 子控制器调用beginAppearanceTransition方法之后就会调用其viewWillAppear.
// 在cellForItem中添加控制器的View到cell的contentView:
// 移除其它子控制器view
for (UIViewController *vc in self.childViewControllers) {
[vc beginAppearanceTransition:NO animated:YES];
[vc.view removeFromSuperview];
[vc endAppearanceTransition];
}
// 添加对应的子控制器view 到 对应cell
UIViewController *vc = self.childViewControllers[indexPath.row];
// 添加到contentView
[cell.contentView addSubview:vc.view];
注: 移除子控制器的时候, 要确保viewWillDisappear和viewDidDisappear被调用, 需调用控制器的beginAppearanceTransition:animated:方法和endAppearanceTransition方法.