9

Próbuję dodać kontroler widoku dziecko do UIViewController zawartej w UINavigationController z tym kodem:Dodaj widok podrzędny kontroler do UINavigationController

- (void)buttonTapped:(id)sender 
{ 
    MyChildController *viewController = [self.storyboard instantiateViewControllerWithIdentifier:@"MyChild"]; 
    [self addChildViewController:viewController]; 
    [self.view addSubview:viewController.view]; 
    [viewController didMoveToParentViewController:self]; 


    viewController.view.alpha = 0.0f; 
    [UIView animateWithDuration:0.4 animations:^{ 
     viewController.view.alpha = 1.0f; 
    }]; 
} 

Ale ta jest wynikiem:

Image Result

Jak widać, UINavigatioBar i UIToolbar nadal znajdują się na kontrolerze widoku podrzędnego. Jak mogę umieścić kontroler widoku podrzędnego na wszystkich? Ja już próbował zastąpić kod z:

[self.navigationController addChildViewController:viewController]; 
    [self.navigationController.view addSubview:viewController.view]; 
    [viewController didMoveToParentViewController:self.navigationController]; 

Ale w ten sposób viewDidAppear:animated z viewController nie sprawdzony, nie wiem dlaczego.

Odpowiedz

5

W swoim pierwszym kontrolerze widoku, zrób coś takiego:

- (IBAction)buttonClick:(id)sender 
{ 
    SecondViewController *secondView = [self.storyboard instantiateViewControllerWithIdentifier:@"SecondViewController"]; 
    UIImage *blurryImage = [UIImage imageNamed:@"foo.jpeg"]; 
    secondView.imageView.image = blurryImage; 
    [self.navigationController addChildViewController:secondView]; 
    secondView.view.frame = self.navigationController.view.frame; 
    [self.navigationController.view addSubview:secondView.view]; 
} 

Następnie w drugim kontrolerze widoku, należy dodać getter dla ImageView:

-(UIImageView *)imageView 
{ 
    if(_imageView == nil) 
    { 
     _imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 320, 548)]; 
     [self.view addSubview:_imageView]; 
    } 
    return _imageView; 
} 
+0

Próbuję użyć podejście viewcontroller-kontenera, bo muszę rozmycie tle widok modalnego widzenia kontroler, który jest również półprzezroczysty. Efekt jest taki sam, jak widok powiadomień, który przeciągasz z góry ekranu. Tło jest półprzezroczyste, a także szkło rozmyte/matowe. Dlaczego jeśli dodaję kontrolkę widoku podrzędnego do 'self.navigationController', metoda' viewDidAppear' nie jest wywoływana? –

+0

Hmm ... nie do końca pewny ... czy próbowałeś wywoływać [viewController viewWillAppear: NO]? – JonahGabriel

+1

Tak i nic nie robi. Muszę wywołać '[viewController viewDidAppear: NO]' zaraz po linii '[viewController didMoveToParentViewController: self.navigationController]'. Dlaczego, do cholery, metody nie są wywoływane? W przeciwnym razie, jeśli dodaję kontrolkę widoku dziecka do 'self', a nie' self.navigationController', to działa, ale jak pokazano na powyższym obrazie, widok jest 'wewnątrz' 'navigationController'. –

28

@Sam „s komentarz jest prawidłowe. Musisz zadzwonić pod numer beginApperanceTransition:animated: i endAppearanceTransition, aby uruchomić viewDidAppear. Powodem, dla którego UINavigationController nie wywołuje viewDidAppear podczas dodawania kontrolera widoku podrzędnego jest to, że nadpisał jego metody składowania kontenera, aby uniemożliwić programistce dodawanie kontrolera widoku podrzędnego w dziwnych miejscach. W twoim przypadku nie chce, aby twój widok dziecka zakrywał pasek nawigacji. Prawidłowe użycie kontrolera nawigacyjnego powoduje, że pod paskiem nawigacji pojawiają się dzieci. Mimo to możesz nadal wymuszać na tym niestandardowym interfejsie użytkownika, ręcznie informując dziecko, kiedy pojawia się i kiedy skończy się pojawiać.

Dodać dziecku 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]; 
    } 
]; 

usunąć dziecko z 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]; 
    } 
]; 
+1

Myślę, że dziecko będzie nazywać 'didMoveToParentViewController:' kiedy zostanie usunięte. Coś jak, '[child didMoveToParentViewController: nil]' –

+0

Pomogło mi ... dziękuję. Dał upvote Pwner. – Femina

+0

bardzo pomocne, dzięki! – kernix