回到父视图后如何保留子视图控制器(容器实现)?
How to retain child view controller (container implementation) after moving back to parent?
我需要在子视图控制器关闭后保留它,以便在需要时将其移回,而无需在子视图控制器中进行额外处理。我尝试使用以下链接实现它:
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 实例的数组。
我需要在子视图控制器关闭后保留它,以便在需要时将其移回,而无需在子视图控制器中进行额外处理。我尝试使用以下链接实现它:
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 实例的数组。