Как сохранить дочерний контроллер представления (реализация контейнера) после возвращения к родителю?
Мне нужно сохранить дочерний контроллер представления после его увольнения, чтобы переместить его обратно, когда это необходимо, без дополнительной обработки в дочернем контроллере представления. Я пытался добиться этого, используя ссылки ниже:
Как 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.