dismissModalViewControllerAnimated работает на себя, но не parentViewController - PullRequest
4 голосов
/ 12 января 2012

Я получил dismissModalViewControllerAnimated для правильной работы со следующей настройкой, но не понимаю, почему он работает на себя (modalViewController), а не parentViewController.

Вот настройки:

  1. У меня есть UITableViewController с кнопкой навигации, которая вызывает модальное представление:


    - (void)viewDidLoad
    {
        [super viewDidLoad];
        self.title = @"Root";

        _data = [NSArray arrayWithObjects:@"One", @"Two", nil];
        _detailController = [[DetailViewController alloc] init];

        // Uncomment the following line to preserve selection between presentations.
        // self.clearsSelectionOnViewWillAppear = NO;

        // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
        // self.navigationItem.rightBarButtonItem = self.editButtonItem;

        self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAction target:self action:@selector(showAbout)];
    }

    - (void)showAbout
    {
        AboutViewController *abv = [[AboutViewController alloc] init];
        abv.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
        [self presentModalViewController:abv animated:YES];
    }

Вот контроллер модального представления AboutViewController с кнопкой на панели инструментов, которая запускает действие отклонения для закрытия модального окна:



    - (IBAction)dismissAction:(id)sender {
        [self dismissModalViewControllerAnimated:YES];
    }

У меня вопрос, почему [self dismissModalViewControllerAnimated] работает, а не [self.parentViewController dismissModalViewControllerAnimated] ??Это новое в iOS 5?Я думал, что только parentViewController способен отклонить дочернее модальное представление?

Спасибо!

Ответы [ 2 ]

10 голосов
/ 12 января 2012

[self dismissModalViewControllerAnimated:YES]; Работал довольно долго.Если вы спросите меня, один из самых секретных секретов в разработке под iOS.

Однако self.parentViewController не работает, фактически является новым для iOS 5. Он был «заменен» на self.presentingViewController.

Это вызывает интересную проблему для кода, пытающегося быть совместимым до iOS 5.Поскольку, как вы обнаружили, self.parentViewController возвращает nil на iOS 5. И UIViewControllers не отвечает на presentingViewController pre-iOS 5.

Это оставляет нам делать что-то вроде этого:

if ([self respondsToSelector:@selector(presentingViewController)]){
    [self.presentingViewController dismissModalViewControllerAnimated:YES];
}
else {
    [self.parentViewController dismissModalViewControllerAnimated:YES];
}
8 голосов
/ 11 мая 2012

Вместо использования того, что сказал NJones, я бы предложил придерживаться

[self dismissModalViewControllerAnimated:YES]

Причина, по которой это будет работать для всех операционных систем, указана в самой документации:

"Представлениеконтроллер представления ответствен за отклонение контроллера представления, который он представил. Однако, если вы вызываете этот метод на самом контроллере представления, он автоматически пересылает сообщение в контроллер представления."

ПРИМЕЧАНИЕ: Примечание об этом методе в iOS5.0.dismissModalViewControllerAnimated: метод устарел.dismissViewControllerAnimated:completion: вместо этого следует использовать здесь.

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