从 UIPageViewController 中删除之前添加的 viewController

Posted

技术标签:

【中文标题】从 UIPageViewController 中删除之前添加的 viewController【英文标题】:Delete previously added viewControllers from the UIPageViewController 【发布时间】:2013-04-24 13:50:24 【问题描述】:

我正在使用一个数组在 UIPageViewController 上添加一些 viewController。问题是当您进一步滑动时它们会留在内存中,我想删除它们。我找到了这个委托方法:

- (void)pageViewController:(UIPageViewController *)pvc didFinishAnimating:(BOOL)finished previousViewControllers:(NSArray *)previousViewControllers transitionCompleted:(BOOL)completed

    // If the page did not turn
    if (!completed)
    
        return;
    
    // This is where I want to delete the previousViewControllers to release memory

但是如何删除那些previousViewControllers?如果您向后滚动,它们需要重新加载,但我需要删除它们,否则它们会一直留在内存中。

【问题讨论】:

UIPageViewController 最多应该挂在 3 个控制器上(当前、上一个、下一个),并且你永远不应该(实际上也不能)删除它所持有的那些。如果您的控制器停留的时间比这更长,可能是因为您在添加它们的数组中保留了对它们的引用。将它们提供给 UIPageViewController 后,您应该能够安全地将任何指向 viewController 的指针设置为 nil,因为 UIPageViewController 保留了指向它们的强指针。 【参考方案1】:

我从未使用过UIPageViewController,但似乎previousViewControllers 是只读的。我要做的是向之前的 ViewController 发送一条消息,告诉它们重新加载。

例如,我相信这将访问显示的最后一个 ViewController:

MyVC *lastVC = (MyVC*)[previousViewControllers objectAtIndex:[previousViewControllers count]-1];
lastVC.reloadFlag = YES; // Assuming you have a reloadFlag property in your MyVC class

所以你可以把它放在你问题中的方法中。

然后确保在您返回 ViewController 时在您的 MyVC * 对象中调用 viewWillAppear,如果是,请在其中放入一个简单的东西:

if(_reloadFlag) 
    //updateUI

这只是一个想法,您可能需要更改一些内容才能使其发挥作用。

【讨论】:

问题是添加到 UIPageViewController 上的 viewController 来自不同的类,例如不仅“MyVC”,还有 MyVC2、MyVC3、MyVC4 等...... 也许你可以让你所有的 VC 类都继承自一个超类,该超类将标志作为一个属性? 或者您将标志添加到所有类(如果没有太多)并使用 [lastVC isKindOfClass:@"..."] 检查类?

以上是关于从 UIPageViewController 中删除之前添加的 viewController的主要内容,如果未能解决你的问题,请参考以下文章

将删除滑动手势从 UIPageViewController 传递给 UITableView

IOS 如何从其子级访问 uipageviewcontroller?

如何将数据从 UIPageViewController 传递到它的“子视图”之一?

从 UIPageViewController 中删除之前添加的 viewController

从 Swift 3 中的 UIPageViewController 中删除黑边

从 UIPageViewController 模态显示 UINavigationController 会锁定 iOS 9