Add child view controller to UINavigationController

后端 未结 3 1198
南笙
南笙 2021-01-31 05:30

I\'m trying to add a child view controller to a UIViewController contained in a UINavigationController with this code:

- (void)buttonTa         


        
3条回答
  •  陌清茗
    陌清茗 (楼主)
    2021-01-31 05:58

    @Sam's comment is correct. You need to call beginApperanceTransition:animated: and endAppearanceTransition for viewDidAppear to be triggered. The reason why UINavigationController does not call viewDidAppear when you add a child view controller is because it has overridden its container composition methods to prevent the programmer from adding a child view controller in strange places. In your case, it doesn't want your child view to cover up the navigation bar. The correct usage of a navigation controller is to have children appear under the navigation bar. Nonetheless, you can still force upon this non-standard UI by manually telling the child when it is appearing and when it has finished appearing.

    Add a child to UINavigationController

    MyChildViewController* child = [[MyChildViewController alloc] init];
    [self.navigationController addChildViewController:child];
    child.view.frame = self.navigationController.view.bounds;
    [self.navigationController.view addSubview:child.view];
    child.view.alpha = 0.0;
    [child beginAppearanceTransition:YES animated:YES];
    [UIView
        animateWithDuration:0.3
        delay:0.0
        options:UIViewAnimationOptionCurveEaseOut
        animations:^(void){
            child.view.alpha = 1.0;
        }
        completion:^(BOOL finished) {
            [child endAppearanceTransition];
            [child didMoveToParentViewController:self.navigationController];
        }
    ];
    

    Remove a child from UINavigationController

    [child willMoveToParentViewController:nil];
    [child beginAppearanceTransition:NO animated:YES];
    [UIView
        animateWithDuration:0.3
        delay:0.0
         options:UIViewAnimationOptionCurveEaseOut
        animations:^(void){
            child.view.alpha = 0.0;
        }
        completion:^(BOOL finished) {
            [child endAppearanceTransition];
            [child.view removeFromSuperview];
            [child removeFromParentViewController];
        }
    ];
    

提交回复
热议问题