gpt4 book ai didi

iphone - 从 UIPageViewController 卸载 viewController

转载 作者:行者123 更新时间:2023-11-28 20:21:17 28 4
gpt4 key购买 nike

我有一个 UIPageViewController,我可以在其中添加其他 viewController。这些 ViewControllers 在数组 viewControllersArray = [[NSMutableArray alloc] init]; 中我像这样在这个数组上添加 viewControllers:

        [viewControllersArray addObject: infoViewController];

将 viewController 添加到我的数组后:

NSArray *initialViewControllers = [[NSArray alloc] initWithObjects:[viewControllersArray objectAtIndex:0], nil];
[self setViewControllers:initialViewControllers
direction:UIPageViewControllerNavigationDirectionForward
animated:YES
completion:^(BOOL finished){
NSLog(@"call back success");}];

以上代码全部在我的 UIPageViewController 的 viewDidLoad 中完成。

为了加载这个数组,我从 <UIPageViewControllerDataSource> 得到了那些函数我这样使用:

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController {
if ([viewControllersArray containsObject:viewController]) {
NSInteger index = [viewControllersArray indexOfObject:viewController];
if (index < [viewControllersArray count] && index > 0) {
return [viewControllersArray objectAtIndex:(index - 1)];
}
}
return nil;
}

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController {
if ([viewControllersArray containsObject:viewController]) {
NSInteger index = [viewControllersArray indexOfObject:viewController];
if (index < [viewControllersArray count] - 1) {
return [viewControllersArray objectAtIndex:(index + 1)];
}
}
return nil;
}

现在的问题是,当您滑动时,下一个 View Controller 会加载,等等。但它们不会被卸载。所以我正在寻找一种方法来卸载您已经传递的 View Controller 以节省内存,并且当您向后滑动时它们将被重新加载。

最佳答案

您的问题是您在 viewControllersArray 中保留了您的 View Controller 。该数组包含对您添加到其中的每个对象的强引用。节省内存的最简单方法是在 pageViewController:viewControllerBeforeViewController:pageViewController:viewControllerAfterViewController: 数据源方法中即时创建请求的 View Controller 。这样,只有页面 View Controller 将对 View Controller 有强引用,并在它移出屏幕后释放(释放)它。

如果即时创建它们的成本太高,您可以考虑只在数组中保留 3 个 View Controller :当前显示的一个以及紧靠左侧和紧靠右侧的一个。

例子:

- (UIViewController *)pageViewController:(UIPageViewController *)pvc
viewControllerBeforeViewController:(MyGreatViewController *)vc
{
NSUInteger index = vc.position - 1; //custom property on your VC
if (index > 0) {
return [[MyGreatViewController alloc] initWithPosition:index];
}

return nil;
}

- (UIViewController *)pageViewController:(UIPageViewController *)pvc
viewControllerBeforeViewController:(MyGreatViewController *)vc
{
NSUInteger index = vc.position + 1; //custom property on your VC
if (index <= MAX_POSITION) {
return [[MyGreatViewController alloc] initWithPosition:index];
}

return nil;
}

尽情享受吧!

关于iphone - 从 UIPageViewController 卸载 viewController,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15832644/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com