回到父视图后如何保留子视图控制器(容器实现)?

How to retain child view controller (container implementation) after moving back to parent?

我需要在子视图控制器关闭后保留它,以便在需要时将其移回,而无需在子视图控制器中进行额外处理。我尝试使用以下链接实现它:

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

How does View Controller Containment work in iOS 5?

这些链接(以及类似的其他链接)确实用于带来子视图控制器或关闭它但不是 "retaining it"。请在下面找到我的代码:

/* 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];
}];

如果需要带子控"again on swipe on parent",整个过程又得重新来一遍。我需要做的只是 "Bringing the child up on swipe gesture" 处理而不是再次实例化,因为实例化会在子控制器中处理数据(耗时)。

我是 iOS 应用程序编程的菜鸟,所以如果这是一个明显的问题,请耐心等待。

好的,首先,您需要确保您的 detailsViewController 属性 是使用强引用声明的,如下所示:

@property (strong, nonatomic) UIViewController *detailsViewController;

这意味着只要声明此 属性 的 class 仍在内存中,那么此 属性 也会如此。 'strong' 表示它会保留,即使被认为不再使用。

现在介绍这个对象的创建/删除。您在那里展示的三段代码大致等同于:实例化/显示/隐藏(和删除)。

相反 - 只需在 viewDidLoad 之类的方法上执行一次实例化部分,这样,只需创建一次此 viewController。展示时,只需执行您的动画代码即可。隐藏时,不要执行 removeFromSuperview。所以它只是停留在它所在的地方,在记忆中。它会存在,就在屏幕外,准备好让您再次将它动画化回内存。

还有什么不明白的,请留言

也许有帮助。 在你的 parent class:

        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.

因此,当弹出到 parent 视图控制器时 - 这是一个包含 childViewController 实例的数组。