Проблема с контроллерами модального представления и definePresentationContext - PullRequest
6 голосов
/ 28 октября 2011

Я создал собственный контроллер представления контейнера, используя новые методы контроллера представления контейнера UIViewController в iOS 5.

Проблема в том, что, хотя дочерний UIViewController моего контроллера контейнера имеет definesPresentationContext = YES, когда он создает и представляет другой контроллер модального представления , UIKit устанавливает контейнер (а не дочерний) как представляющий контроллер.

Например, в 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
}

Куда я иду не так?

Как мне убедиться, что это дочернее представление, которое открывается, когда модальное представление закрывается (а не представление контейнера)?

1 Ответ

18 голосов
/ 20 декабря 2011

Добавьте эту строку перед представлением контроллера представления:

vc.modalPresentationStyle = UIModalPresentationCurrentContext

Если вы проделали все правильные действия типа «родитель-потомок» на протяжении всей цепочки контроллера представления, это приведет к замене представленного представления.представление MyChildViewController, а затем представление MyChildViewController вернется, когда представленное представление будет отклонено.

О, и я забыл упомянуть, даже тогда это будет работать только на iPad.Представление представленного контроллера представления всегда занимает весь экран на iPhone - оно всегда представляется из корневого представления.

РЕДАКТИРОВАТЬ: Начиная с iOS 8, эта функция также доступна на iPhone.(Так же, как и всплывающие окна и раздельные представления - в основном, большинство утверждений вида «только на iPad» стали ложными с iOS 8, что, на мой взгляд, является потрясающей новостью.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...