ios - 如何删除 UIPageViewController 中的 View Controller 之后、之前?

标签 ios swift

我需要删除 UIPageViewController 中所有缓存的前后 View Controller ,以便在用户滚动 UIPageViewController 时创建新的前后 View Controller 。

如何删除 View Controller 之前和之后的缓存?

我需要许多可以控制 UIPageViewController 的函数,但似乎很少有函数可以做到这一点。

*我附上了我的代码的简化版本。 整个调用序列非常复杂,因为它包括 Alamofire HTTP 请求并异步工作。

class ViewCalendarPageVC: UIPageViewController {

    var targetViewCalendarVC: ViewCalendarVC2?
    var viewCalendarVC: ViewCalendarVC2?

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
        dataSource = self

        let storyboard = UIStoryboard(name: "Main", bundle: Bundle.main)

        // Instantiate View Controller
        viewCalendarVC = storyboard.instantiateViewController(withIdentifier: "ViewCalendarVC2") as! ViewCalendarVC2

        var parentVC: TopViewController = (self.parent as? TopViewController)!
        viewCalendarVC!.selectedMonthYear = parentVC.selectedMonthYear!

        setViewControllers([viewCalendarVC!], direction: .forward, animated: true, completion: nil)
    }

    func showCalendar(){
        targetViewCalendarVC?.showCalendar()        
    }

}
extension ViewCalendarPageVC: UIPageViewControllerDataSource {

    func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {                
        let storyboard = UIStoryboard(name: "Main", bundle: nil)

        // Instantiate View Controller
        let viewController = storyboard.instantiateViewController(withIdentifier: "ViewCalendarVC2") as! ViewCalendarVC2

        var dateComponent = DateComponents()
        dateComponent.month = -1//monthsToAdd
        dateComponent.day = 0 //daysToAdd
        dateComponent.year = 0 //yearsToAdd

        var parentVC: TopViewController = (self.parent as? TopViewController)!

        viewController.selectedMonthYear = Calendar.current.date(byAdding: dateComponent, to: parentVC.selectedMonthYear!)

        return viewController
   }

    func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {             
        let storyboard = UIStoryboard(name: "Main", bundle: nil)

        // Instantiate View Controller
        let viewController = storyboard.instantiateViewController(withIdentifier: "ViewCalendarVC2") as! ViewCalendarVC2

        var dateComponent = DateComponents()
        dateComponent.month = +1//monthsToAdd
        dateComponent.day = 0 //daysToAdd
        dateComponent.year = 0 //yearsToAdd

        var parentVC: TopViewController = (self.parent as? TopViewController)!

        viewController.selectedMonthYear = Calendar.current.date(byAdding: dateComponent, to: parentVC.selectedMonthYear!)

        return viewController
   }

}

最佳答案

我认为“重置”缓存的唯一方法是 UIPageViewController 中的 setViewControllers 方法:

let vc = UIViewController()
setViewControllers([vc], direction: .forward, animated: false, completion: nil)

所以要在用户滚动后执行此操作,显示的 ViewController 应该在它出现后立即通知 PageViewController:

protocol MyPageViewControllerDelegate: class {
    func viewControllerDidAppear(_ vc: UIViewController)
}

class MyPageViewController: UIPageViewController, MyPageViewControllerDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()

        let vc = MyViewController()
        vc.delegate = self
        setViewControllers([vc], direction: .forward, animated: false, completion: nil)
    }

    func viewControllerDidAppear(_ vc: UIViewController) {
        setViewControllers([vc], direction: .forward, animated: false, completion: nil)
    }
}

class MyViewController: UIViewController {
    weak var delegate: MyPageViewControllerDelegate?

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)

        delegate?.viewControllerDidAppear(self)
    }
}

注意:我没有测试这段代码,如果在调用setViewControllers之后每次都调用viewDidAppear,可能会导致无限循环。试一试,让我知道


更新:

protocol MyPageViewControllerDelegate: class {
    func viewControllerDidAppear(_ vc: UIViewController)
}

class ViewCalendarPageVC: UIPageViewController {

    var targetViewCalendarVC: ViewCalendarVC2?
    var viewCalendarVC: ViewCalendarVC2?

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
        dataSource = self

        let storyboard = UIStoryboard(name: "Main", bundle: Bundle.main)

        // Instantiate View Controller
        viewCalendarVC = storyboard.instantiateViewController(withIdentifier: "ViewCalendarVC2") as! ViewCalendarVC2

        var parentVC: TopViewController = (self.parent as? TopViewController)!
        viewCalendarVC!.selectedMonthYear = parentVC.selectedMonthYear!
        viewCalendarVC.delegate = self // ADD THIS and implement ViewCalendarVC2 as MyViewController above

        setViewControllers([viewCalendarVC!], direction: .forward, animated: true, completion: nil)
    }

    func showCalendar(){
        targetViewCalendarVC?.showCalendar()
    }

    //MyPageViewControllerDelegate
    func viewControllerDidAppear(_ vc: UIViewController) {
        setViewControllers([vc], direction: .forward, animated: false, completion: nil)
    }

}

关于ios - 如何删除 UIPageViewController 中的 View Controller 之后、之前?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58856188/

相关文章:

ios - 在 iPhone 应用程序处于待发布状态后在 iTunes Connect 中编辑屏幕截图

ios - 如何在 swift 4 中使用 UIImagePickerController

ios - 如何使用自定义 GKComponent 创建 SKSpriteNode?

swift - 如何将另一个 Cocoa 应用程序窗口置于最前面

ios - prepareForInterfaceBuilder 中的约束?

javascript - 使用自动生成的 objectId 或为 Parse 中的映射类创建自己的唯一 ID

ios - UIAlertView 处理文本字段

ios - 从 UIAlertView 文本字段获取文本的问题

ios - 无法将类型 'UIView' 的值转换为 'SKView'

ios - 如何在 Delegate 中检查 UITableView 中的当前 Controller