我有一个 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/