Как сохранить дочерний контроллер представления (реализация контейнера) после возвращения к родителю?

Мне нужно сохранить дочерний контроллер представления после его увольнения, чтобы переместить его обратно, когда это необходимо, без дополнительной обработки в дочернем контроллере представления. Я пытался добиться этого, используя ссылки ниже:

https://developer.apple.com/library/ios/featuredarticles/ViewControllerPGforiPhoneOS/ImplementingaContainerViewController.html

Как View Controller Containment работает в iOS 5?

Эти ссылки (и другие подобные) действительно служили для того, чтобы вызвать дочерний контроллер представления или отклонить его, но не "сохранить его". Пожалуйста, найдите мой код ниже:

/* Adding a child view controller */
self.detailsViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"DetailsViewController"];
self.detailsViewController.name = @"DetailsText";
// data to do "processing in viewDidLoad of child"
self.detailsViewController.someOtherDataForProcessing = someOtherDataForProcessing;
self.detailsViewController.delegate = self;
[self addChildViewController:self.detailsViewController];
self.detailsViewController.view.frame = CGRectMake(0, self.view.frame.size.height, self.view.frame.size.width, 200);
[self.view addSubview:self.detailsViewController.view];


/* Bringing the child up on swipe gesture */
[UIView animateWithDuration:0.5 animations:^{
    self.detailsViewController.view.frame = CGRectMake(0, 100, self.view.frame.size.width, 200);
}  completion:^(BOOL finished) {
    [self.detailsViewController didMoveToParentViewController:self];
}];


/* Moving child down when back pressed on child */
[UIView animateWithDuration:0.5 animations:^{
    [self.detailsViewController willMoveToParentViewController:nil];

    self.detailsViewController.view.frame = CGRectMake(0, self.view.frame.size.height, self.view.frame.size.width, 200);
} completion:^(BOOL finished) {
    [self.detailsViewController.view removeFromSuperview];
    [self.detailsViewController removeFromParentViewController];
}];

Если мне нужно принести дочерний контроллер "снова на пальце по родителю", мне придется пройти через весь процесс снова. Что мне нужно, так это просто выполнить процесс "Воспитание ребенка с помощью жеста пальцем" и не создавать его снова, поскольку создание экземпляров будет выполнять обработку данных в дочернем контроллере (отнимает много времени).

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

2 ответа

Решение

Хорошо, во-первых, вам нужно убедиться, что ваше свойство detailsViewController объявлено с сильной ссылкой, что-то вроде этого:

@property (strong, nonatomic) UIViewController *detailsViewController;

Это означает, что до тех пор, пока класс, который объявляет это свойство, все еще находится в памяти, это свойство также будет. "Сильный" означает, что он остается, даже если считается, что он больше не используется.

Теперь о создании / удалении этого объекта. Три раздела кода, которые вы там показали, примерно равны: создать / показать / скрыть (и удалить).

Вместо этого - просто выполните создание экземпляра один раз в методе, подобном viewDidLoad, чтобы один раз создать этот viewController. При показе просто делайте анимационный код. При сокрытии НЕ делайте removeFromSuperview. Так что он просто остается в памяти. Он будет существовать, просто за кадром, готовый снова оживить его в памяти.

Что-нибудь еще не ясно, пожалуйста, кричите.

Может быть, это поможет. В вашем родительском классе:

        if (self.arrayControllers == nil) {
            self.arrayControllers = [[NSMutableArray alloc] initWithArray: self.navigationController.viewControllers];
        }
        for (UIViewController *vc in self.arrayControllers) {
            if ([vc isKindOfClass:[YourRetainedViewController class]])
                controller = vc;
        }
        if (controller == nil) {
            controller = [[YourRetainedViewController alloc] init];
            [self.arrayControllers addObject:controller];
        }
        [self.navigationController pushViewController:controller animated:YES];

Вот:

self. self.arrayControllers - массив в ParentViewController, который является сильным свойством.YourRetainedViewController - ChildViewController.

Так что, когда поп в родительский контроллер представления - вот массив, который содержит экземпляр childViewController.

Другие вопросы по тегам