我有一个UIPageViewController,我添加了其他viewControllers。那些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;
}
现在的问题是,当您滑动时,下一个viewcontrollers会加载等等。但是它们不会被卸载。因此,我正在寻找一种方法来卸载已经传递的视图控制器以节省内存,当您向后滑动时,它们将被重新加载。
答案 0 :(得分:3)
你的问题是你在viewControllersArray
中坚持你的视图控制器。该数组对您添加到其中的每个对象都有一个强引用。保存内存的最简单方法是在pageViewController:viewControllerBeforeViewController:
和pageViewController:viewControllerAfterViewController:
数据源方法中动态创建请求的视图控制器。这样,只有页面视图控制器才会有一个对视图控制器的强引用,并且一旦它移出屏幕就会释放(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;
}
享受!
答案 1 :(得分:0)
您不应卸载View Controller。如果内存不足,控制器会卸载其视图。在代码中,使用-(void)viewDidUnload
和-(void)didReceiveMemoryWarning
(iOS 6)释放您的资源。当UIPageViewController显示某个页面时,控制器会重新创建卸载的视图并调用-(void)viewDidLoad
(如果您手动自定义控制器)。