1

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

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

视图控制器包含在 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 应用程序编程的菜鸟,所以如果这是一个明显的问题,请多多包涵。

4

2 回答 2

0

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

@property (strong, nonatomic) UIViewController *detailsViewController;

这意味着只要声明这个属性的类还在内存中,那么这个属性也会在内存中。“强”意味着它保持不变,即使被认为不再使用。

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

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

还有什么不清楚的,请多多指教。

于 2016-04-11T09:55:49.040 回答
0

也许它有帮助。在您的父类中:

        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 实例的数组。

于 2016-04-11T10:06:09.153 回答