解决UIViewController中添加子控制器viewWillAppear不调用问题

时间:2023-03-09 18:05:14
解决UIViewController中添加子控制器viewWillAppear不调用问题

问题描述:

我在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方法.