0

我有一个 UIPageViewController,我在其中添加了其他 viewController。这些 ViewControllers 在数组中,viewControllersArray = [[NSMutableArray alloc] init];我在这个数组上添加 viewControllers,如下所示:

        [viewControllersArray addObject: infoViewController];

在我的数组上添加 viewControllers 后:

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;
}

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

4

2 回答 2

3

您的问题是您在viewControllersArray. 该数组包含对您添加到其中的每个对象的强引用。节省内存的最简单方法是在 thepageViewController:viewControllerBeforeViewController:pageViewController:viewControllerAfterViewController:data source 方法中动态创建请求的视图控制器。这样,只有页面视图控制器才会对视图控制器有强引用,并且一旦它移出屏幕就会释放(dealloc)它。

如果动态创建它们太昂贵,您可能会考虑在数组中只保留 3 个视图控制器:当前显示的一个以及紧靠左侧和紧靠右侧的一个。

例子:

- (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;
}

享受!

于 2013-04-05T11:42:12.753 回答
0

您不应该卸载 View Controller。如果内存不足,控制器会卸载他们的视图。在代码中,使用-(void)viewDidUnloadand -(void)didReceiveMemoryWarning(iOS 6) 来释放您的资源。当 UIPageViewController 将显示某个页面时,控制器会重新创建卸载的视图并调用-(void)viewDidLoad(如果您手动自定义控制器)。

于 2013-04-05T11:47:23.450 回答