2011-10-28 12 views
6

Utworzyłem kontroler widoku niestandardowego kontenera przy użyciu new UIViewController container view controller methods w iOS 5.Problem ze sterownikami i modalnych Zobacz definesPresentationContext

Kłopot w tym, choć moim kontrolera kontenera dziecko UIViewController ma definesPresentationContext = YES, gdy creates and presents another modal view controller, UIKit ustawia kontener (a nie dziecko) jako kontroler prezentujący.

Na przykład w MyChildViewController.m:

- (void)showMailComposeView:(id)sender { 

    __block MFMailComposeViewController *vc = 
      [[MFMailComposeViewController alloc] init]; 
    vc.mailComposeDelegate = self; 
    vc.subject = @"Subject"; 

    self.definesPresentationContext = YES; 

    [self presentViewController:vc animated:YES completion:^{ 

     if ([self.modalViewController isEqual:vc]) 
      NSLog(@"This should print..."); 

     if ([vc.presentingViewController isEqual:self.parentViewController]) 
      NSLog(@"... but this shouldn't"); 

     // NOTE: Both log statements printed 

    }]; 
} 

- (void)mailComposeController:(MFMailComposeViewController*)controller 
      didFinishWithResult:(MFMailComposeResult)result 
         error:(NSError*)error 
{ 
    [self dismissViewControllerAnimated:YES completion:^{}]; 

    // NOTE: self.parentViewController.view now displays instead of self.view 
} 

Gdzie jestem będzie niewłaściwy?

Jak upewnić się, że jest to widok, który zostanie ujawniony, gdy widok modalny zostanie odrzucony (zamiast widoku kontenera)?

Odpowiedz

17

Dodaj tę linię przed przedstawieniem kontrolera wyświetlania:

vc.modalPresentationStyle = UIModalPresentationCurrentContext 

Jeśli zrobiłeś wszystkie właściwe rzeczy, rodzic-dziecko przez całą drogę w górę łańcucha widok kontrolera, to spowoduje, że przedstawiony widok zastąpić Widok MyChildViewController, a następnie widok MyChildViewController zostanie zwrócony po odrzuceniu prezentowanego widoku.

Aha, i zapomniałem wspomnieć, nawet wtedy to będzie działać tylko na iPadzie. Przedstawiony widok kontrolera widoku zajmuje cały ekran na ekranie iPhone'a - zawsze jest prezentowany z widoku głównego.

EDYCJA: Począwszy od wersji iOS 8, ta funkcja jest również dostępna na iPhone. (Podobnie jak popover i podzielone poglądy - w zasadzie większość oświadczeń w formularzu "tylko na iPadzie" stała się nieprawdziwa z iOS 8, który moim zdaniem jest niesamowitym news.)

+0

Podczas gdy moje pytanie/problem był trochę inny, to pracował dla mnie! Dzięki! – chadbag

+0

To samo tutaj. Dziękuję Ci za to! – Robert

+2

Ciekawe, dlaczego na telefonie iPhone modal jest zawsze z widoku głównego. Mam podobną sytuację dotyczącą kontenera na iPhonie i wykonując wszystkie powyższe, zastanawiałem się, dlaczego widok modalny nie był prezentowany w granicach widoku kontrolera widoku podrzędnego. Wygląda na to, że jest to zachowanie iPhone'a inne niż iPad. – idStar

Powiązane problemy