iPad: представление модального вида, и мой parentViewController теперь равен нулю? - PullRequest
2 голосов
/ 29 ноября 2011

У меня есть пара модальных представлений, которые работали «просто отлично» и теперь перестали возвращаться к родительскому контроллеру представления и «код не изменился».- классическое описание проблемы.

Я отладил отклонение модального представления, и родительский контроллер представления - ноль, который объясняет проблему, но не причину.Я обновил свой SDK с 4.1.2 до 4.2, чтобы начать работу с iOS 5. Я подозреваю, что у меня есть новый ARC для управления памятью и мой стиль автоматического выпуска по сравнению с retain / release.

Ниже приведен кодмой контроллер rootview для AboutViewController:

- (IBAction)doInfo:(id)sender {
    NSLog(@"%s", __FUNCTION__);
    AboutViewController *aboutViewController = [[[AboutViewController alloc] initWithNibName:@"AboutViewController" bundle:[NSBundle mainBundle]] autorelease];
    if (aboutViewController) {
        aboutViewController.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
        aboutViewController.hidesBottomBarWhenPushed = YES;
        self.navigationController.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
        self.navigationController.navigationBarHidden = YES;
        [self presentModalViewController:aboutViewController animated:YES];
    }
}

Ниже приведено отклонение в AboutViewController обратно к его родителю после нажатия кнопки «Готово».

- (IBAction)doDone:(id)sender {
    NSLog(@"%s", __FUNCTION__);
    [[self parentViewController] dismissModalViewControllerAnimated:YES];
}

ОК ... Я исправилизменив следующим образом.Теперь вопрос, почему это работало раньше?

- (IBAction)doDone:(id)sender {
    NSLog(@"%s", __FUNCTION__);
    [self dismissModalViewControllerAnimated:YES];
}

Ответы [ 2 ]

6 голосов
/ 29 ноября 2011

Цитата из [1] о недвижимости parentViewController:

До iOS 5.0, если представление не имело родительского контроллера представления и было представлено модально, контроллер представления, который представлял его, будет возвращен. Это больше не так. Вы можете получить контроллер представления представления, используя свойство presentingViewController.

Так что это решает проблему, почему это работало раньше и больше не работает. При сборке для iOS 5 я бы использовал свойство presentingViewController, как рекомендовано документами, чтобы позволить родительскому контроллеру представления (или в этом случае представления) отклонить модальное представление. Однако при сборке для iOS 4 и 5 я бы оставил ваш код на месте, так как он все равно перенаправляет вызов на соответствующий контроллер представления.

Если в любом случае приложение без сбоев работало на iOS 5 перед перекомпиляцией, я бы предположил, что Apple применила некоторые хитрости во время выполнения, которые имитируют старое поведение для приложений, скомпилированных до iOS5.

[1] http://developer.apple.com/library/ios/#documentation/uikit/reference/UIViewController_Class/Reference/Reference.html

1 голос
/ 22 марта 2012

Я создал категорию, которая добавляет presentingViewController на iOS 4.

Самостоятельно отключается на iOS 5.

Вы можете использовать его без проблем. Пожалуйста, смотрите назад-модальный .

Надеюсь, это принесет вам столько же пользы, сколько и мне; Это делает ваш код более чистым!

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